2012-03-16 5 views
5

私はhereという以下のシングルトン実装を行っていました。私は静的コンストラクタが最初の静的メソッド呼び出しの前に実行されるか、またはオブジェクトがインスタンス化される前に実行されることを理解しますが、ここで(コメントからの)使用さえ理解できませんでした。誰も私がそれを理解するのを助けることができますか?空の静的コンストラクタを使用したシングルトン実装

public sealed class Singleton 
{ 
    private static readonly Singleton instance = new Singleton(); 

    // Explicit static constructor to tell C# compiler 
    // not to mark type as beforefieldinit 
    static Singleton() 
    { 
    } 

    private Singleton() 
    { 
    } 

    public static Singleton Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 
} 
+2

これは、その下の箇条書きの点で具体的に説明されています。 '型初期化子の怠惰は、型が 'beforefieldinit'という特別なフラグでマークされていない場合にのみ.NETによって保証されます。残念ながら、C#コンパイラ(.NET 1.1ランタイムでは少なくとも提供されています)は、静的コンストラクタ(つまり、コンストラクタのように見えますが、静的とマークされたブロック)を持たないすべての型を 'beforefieldinit'彼は 'new Singleton()'をできるだけ遅く(遅れて)構築したいと思っています。これを行うためにC#コンパイラを得る唯一の方法は空の静的コンストラクタを提供することです。 – porges

+0

私の無知を許してください。 「初期化器の怠惰」とは何ですか?最初の要求時に初期化されますか? – Nemo

+0

正確に。そのような場合にのみ保証されます。そうしないと、型がロードされるとすぐにランタイムは必要なときにいつでも型初期化子を実行できます。もっと長い説明については、Jayの答えのリンクを参照してください。 – porges

答えて

7

静的コンストラクタは、コンパイラbeforefieldinitフラグを設定しないを作るための方法として、それが何か他のものの前または後に呼び出されるべきであることを順番にありません。ここでは、この上の

詳細情報:What does beforefieldinit flag do?

根拠シングルトンオブジェクトの初期化に怠惰の尺度を達成することです。 beforefieldinitが設定されている場合(静的コンストラクターが定義されていないため)、Singleton.Instanceを条件付きで参照するメソッドを実行すると、条件が満たされず呼び出しが行われなくてもシングルトンオブジェクトが初期化されます。一方

public void Foo() 
{ 
    if (false) 
    { 
     var bar = Singleton.Instance.SomeMethod(); 
    } 
} 

、(静的コンストラクタが定義されているので - も空の)をbeforefieldinitが設定されていない場合は、同じ方法でのみシングルトンインスタンス条件場合に初期化させるであろうことを実行します満足しており、その電話番号は、実際はとなっています。資料では、シングルトンクラスに定義した静的メンバを呼び出すこともInstanceが初期化されるようになりますので、この特定の実装が完全に怠惰ではないことを指摘するために行く

関連する問題