シングルトンの静的インスタンスを作成するこれらの方法の違いは何ですか?
質問
最近、ライブラリがデバッグビルドではなくリリースビルドとしてビルドされたときにのみ現れるバグがありました。ライブラリは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は、別の管理対象アプリから完全に使用できるように見えました。
他のヒント
Marc Gravellが言ったことを繰り返しますが、それはbeforefieldinitの問題のように非常に聞こえます。つまり、空の静的コンストラクターが解決策です。決定的な答えを得るには、クラス内のすべてのコンストラクターを投稿する必要があります。
2番目の方法には、遅延読み込みの利点があります(それが利点です)。
所属していません StackOverflow