정적 속성 getter에서 생성 된 새로운 객체는 한 번만 생성됩니까?
-
19-09-2019 - |
문제
나는 내가 쓰고있는 웹 서비스를위한 정적 헬퍼 클래스를 만들고있다. 나는 Telligent의 API를 활용하고 있으므로 플랫폼으로 일을 할 수있는이 "서비스"객체를 만들고 있습니다. 예를 들어, 도우미 클래스에서 멤버십 객체를 만들어 동일한 개체로 멤버십 작업을 수행 할 수 있습니다. 내 도우미 클래스에는 다음과 같은 새로운 개체를 만드는 getter가있는 속성이 있습니다.
private static MembershipService _MembershipService {
get {
return new MembershipService(path, usr, pwd);
}
}
그런 다음 해당 속성을 반환하는 방법이 있습니다.
public MembershipService getMembershipService() {
return _MembershipService;
}
속성이 정적이기 때문에 Getter에서 생성 된 새 개체가 한 번만 만들어 졌다는 것을 의미합니까? 또한 코딩 스타일 측면에서 속성을 공개하는 것이 더 좋을 것이므로 방법은 불필요합니다.
아니면 ... 개인 변수로 객체를 만들고 공개 방법을 통해 반환하는 것이 좋습니다.
private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
public MembershipService getMembershipService() {
return _mbrSvc;
}
// then called elsewhere by me via:
MembershipService svc = MyHelperClass.getMembershipService();
내가 이것을 설정하는 방법에 대한 스타일에 대한 생각이 있으므로 효율적이고 성능이 좋으면 알려주십시오.
해결책
속성이 정적이기 때문에 Getter에서 생성 된 새 개체가 한 번만 만들어 졌다는 것을 의미합니까?
아니요
new MembershipService(path, usr, pwd);
getter 내부에 관계없이 _MembershipService
선언되고 있습니다 static
호출마다 새 인스턴스가 생성됩니다. 모든 static
이러한 맥락에서 정의 클래스의 인스턴스없이 메소드를 호출 할 수 있다는 의미입니다.
스타일에 대해 언급하는 한, 그것은 실제로 당신이하고 싶은 일에 달려 있습니다. 단일 인스턴스를 원하십니까? 그렇다면 정적 멤버 변수를 만듭니다 _mbrSvc
그리고 getter에서 그것을 반환하십시오.
private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
private static MembershipService _MembershipService {
get {
return _mbrSvc;
}
}
그렇지 않으면 괜찮습니다.
다른 팁
Jason, Mark는 완전성을 위해서만 멤버시 서비스의 정의에 달려 있습니다. 멤버십 서비스가 클래스 인 경우 객체는 호출 방법간에 공유됩니다. 멤버십 서비스가 구조물이라면 항상 사본이 생성됩니다. DotNet에서는 모든 것이 객체이기 때문에 멤버시 서비스 서비스-오브젝트라고 부르는 것만으로도 차이를 지정하지 않습니다.
물체가 생성하는 데 비싸면 게으른 하중과 결합 된 싱글 톤 패턴 사용을 고려하십시오.
private static MembershipService _mbrSvc;
private static MembershipService _MembershipService {
get {
if(_mbrSvc == null)
{
_mbrSvc = new MembershipService(path, usr, pwd);
}
return _mbrSvc;
}
}
당신이 사용할 때마다 새로운 새로운 객체가 생성됩니다.
따라서 첫 번째 접근 방식은 속성에 액세스 할 때마다 새 객체를 만듭니다.
당신이 찾고있는 것은 싱글 톤이라고합니다. 두 번째 접근 방식은 C#에서이를 구현할 가능성 중 하나입니다.