85

beforefieldinit フラグは何をしますか? クラスの IL を調べると、このフラグが表示されますが、このフラグが実際に何をしているのかわかりません。

4

4 に答える 4

137

この問題に関する私の記事を参照してください。

基本的には、 beforefieldinit「静的フィールドが参照される前の任意の時点で型を初期化できる」ことを意味します。理論的には、非常に遅延初期化できることを意味します。フィールドに触れない静的メソッドを呼び出す場合、JIT は型を初期化する必要はありません。

実際には、クラスがそれ以外の場合よりも早く初期化されることを意味します。それを使用する可能性のある最初のメソッドの開始時に初期化しても問題ありませんこれを、最初の実際の使用の直前に型の初期化を行わなければならない、それらに適用されていない型と比較してください。beforefieldinit

したがって、次があるとします。

public static void DoSomething(bool which)
{
    if (which)
    {
        FirstType.Foo();
    }
    else
    {
        SecondType.Bar();
    }
}

両方の型がbeforefieldinit適用されている場合 (C# では、型に静的コンストラクターがない限り、既定で適用されます) 、メソッドの開始時に両方が初期化されますDoSomething(通常は保証されません)。持っていない場合は、フラグに基づいて、そのうちの1 つbeforefieldinitだけが初期化されます。

これが、シングルトン パターンを実装するときに静的コンストラクター (空のコンストラクターでさえも!) を使用するのが一般的である理由です。

于 2009-03-04T14:33:58.747 に答える
6

4.6で変わるらしい

https://github.com/dotnet/coreclr/issues/1193

于 2015-07-04T13:26:10.417 に答える