beforefieldinitフラグは何をしますか?クラスのILを調べると、このフラグが表示されますが、このフラグが実際に何をしているのかわかりません。
beforefieldinitフラグは何をしますか?クラスのILを調べると、このフラグが表示されますが、このフラグが実際に何をしているのかわかりません。
回答:
基本的にbeforefieldinit
は、「静的フィールドが参照される前の任意の時点で型を初期化できる」ことを意味します。理論的には、これは非常に遅延して初期化できることを意味します。フィールドに触れない静的メソッドを呼び出す場合、JITは型を初期化する必要はありません。
実際には、クラスが他の場合よりも早く初期化されることを意味します。クラスを使用する可能性のある最初のメソッドの開始時に初期化しても問題ありません。これを、最初に実際に使用する直前に型の初期化を行う必要がある、beforefieldinit
適用されていない型と比較してください。
したがって、次のようになります。
public static void DoSomething(bool which)
{
if (which)
{
FirstType.Foo();
}
else
{
SecondType.Bar();
}
}
両方の型がbeforefieldinit
適用されている場合(C#では、型に静的コンストラクターがない限り、デフォルトで適用されます)、メソッドの開始時に両方が初期化されますDoSomething
(通常は保証されません)。持っていない場合は、フラグに基づいて、そのうちの1つbeforefieldinit
だけが初期化されます。
これが、シングルトンパターンを実装するときに静的コンストラクター(空のコンストラクターでも!)を使用するのが一般的である理由です。
4.6で変更されるようです
beforefieldinit
なく)?