싱글 톤의 정적 인스턴스를 만드는 이러한 방법의 차이점은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/217932

  •  03-07-2019
  •  | 
  •  

문제

최근에 라이브러리가 디버그 빌드 대신 릴리스 빌드로 제작되었을 때만 나타난 버그가 있습니다. 라이브러리는 COM 래퍼가있는 .NET DLL이며 CocreateInstance를 사용하여 관리되지 않는 C ++ 앱에서 DLL에서 클래스를 생성하고 있습니다. 마침내 버그를 추적했을 때 싱글 톤 객체에 액세스하여 발생했습니다. 싱글 톤 인스턴스가 그렇게 선언했습니다.

private static readonly MyObjectType s_instance = new MyObjectType;

그런 다음 다음과 같이 액세스했습니다.

public static MyObjectType Instance 
    { 
        get 
        {                               
            return s_instance; 
        } 
    } 

이것은 실패했다. 변경 :

private static MyObjectType s_instance;

public static MyObjectType Instance 
    { 
        get 
        {               
            if (s_instance==null) 
            { 
                s_instance = new MyObjectType(); 
            } 
            return s_instance; 
        } 
    } 

문제를 수정했습니다. 초기 사용법이 작동하지 않는 이유와 어느 쪽이든 수행 할 수있는 단점이있는 아이디어가 있습니까?

릴리스 DLL은 다른 관리 앱에서 완벽하게 사용할 수있는 것으로 보입니다.

도움이 되었습니까?

해결책

(빈) 정적 생성자를 추가하거나 싱글 톤을 초기화하십시오. 안에 정적 생성자.

Jon Skeet은 싱글 톤 패턴에 대한 전체 토론을 가지고 있습니다 여기. 왜 실패한 지 잘 모르겠지만, 추측 할 때는 "이전 필드 핀"플래그와 관련이있을 수 있습니다. 이 깃발을 조정하기 위해 정적 생성자를 추가하는 그의 네 번째 예를보십시오. 나는 이전에 전문가라고 주장하지는 않지만이 증상은 논의 된 증상 중 일부에 맞는 것 같습니다. 여기.

다른 팁

Marc Gravell이 말한 것을 반복하지만 소리가납니다. 많이 이전 필드 니트 문제와 마찬가지로 빈 정적 생성자가 솔루션임을 의미합니다. 확실한 답변을 얻으려면 수업에 모든 생성자를 게시해야합니다.

두 번째 방법은 게으른 하중의 장점이 있습니다 (여기서는 이점이 있습니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top