シングルトンの静的インスタンスを作成するこれらの方法の違いは何ですか?

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は、シングルトンパターンの詳細についてこちらで説明しています。失敗した理由はわかりませんが、推測では「beforefieldinit」に関連する可能性があります。フラグ。彼がこのフラグを微調整する静的コンストラクターを追加する4番目の例を参照してください。 beforefieldinitの専門家であるとは言いませんが、この症状はこちら

他のヒント

Marc Gravellが言ったことを繰り返しますが、それはbeforefieldinitの問題のように非常に聞こえます。つまり、空の静的コンストラクターが解決策です。決定的な答えを得るには、クラス内のすべてのコンストラクターを投稿する必要があります。

2番目の方法には、遅延読み込みの利点があります(それが利点です)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top