6

最近、ライブラリがデバッグ ビルドではなくリリース ビルドとしてビルドされた場合にのみ現れるバグがありました。ライブラリは、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 は、別のマネージド アプリから完全に使用できるようでした。

4

2 に答える 2

9

(空の)静的コンストラクターを追加するか、静的コンストラクターでシングルトン初期化してみてください。

Jon Skeetは、ここでシングルトンパターンの完全な議論をしています。なぜ失敗したのかはわかりませんが、おそらく「beforefieldinit」フラグに関連している可能性があります。彼の4番目の例を参照してください。ここでは、静的コンストラクターを追加してこのフラグを微調整しています。私はbeforefieldinitの専門家であるとは主張していませんが、この症状はここで説明した症状のいくつかに適合しているようです。

于 2008-10-20T10:26:47.963 に答える
0

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

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

于 2008-10-20T10:56:19.107 に答える