1. ホーム
  2. .net

[解決済み] beforefieldinitフラグは何をするのですか?

2023-06-24 23:29:44

質問

beforefieldinitフラグは何をするのですか? 私のクラスのILを見ると、このフラグがありますが、このフラグが実際に何をしているのかわかりません?

どのように解決するのですか?

参照 私の記事 をご覧ください。

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

実際には は、クラスが初期化されることを意味します。 より早く である最初のメソッドの開始時に初期化されるのは問題ありません。 で初期化されても問題ありません。これを を持つ beforefieldinit が適用されている場合、型の初期化は最初の 実際の を使用する必要があります。

では、仮に

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

両方のタイプに beforefieldinit が適用されている場合(C#では型に静的コンストラクタがない限り、デフォルトで適用されます)、両者は 両方とも の開始時に初期化されます。 DoSomething メソッドの開始時に初期化されます (通常 - 保証はできません)。もし、それらが beforefieldinit がなければ 一つ のみが初期化されます。

のときに静的コンストラクタ(空でも可!)を使うのが一般的なのはこのためです。 シングルトンパターンを実装する場合 .