beforefieldinit修飾子は何に使いますか?

2246 ワード

クラスAにbeforefieldinit修飾子(beforefieldinit修飾子はコンパイラがコンパイルが完了した後に自動的に追加され、逆コンパイルツールでしか見られない)があると仮定します.総じて、beforefieldinit修飾子を付けることは、「クラスAは変数が参照される可能性がある直前に初期化を早期に完了する.理論的には、beforefieldinit修飾子を加えたクラスAは初期化を遅らせる可能性があり、呼び出された静的メソッドが静的クラス変数を参照していない場合、JITはこのクラスAを初期化する必要はありません.
実際には、コードにクラスAの変数が参照されていなくても、クラスAは早期に初期化される可能性があります.しかし、これも問題ありません.彼はクラス変数を使用する可能性のある最初の方法で初期化することができます.例えば、私たちが酒席を開いているように、具体的に何人が帰ってきたのかを確認することはできません.私たちは事前にテーブル、料理を手配するしかありません(これが初期化の概念です).コードセグメントを比較すると、コードセグメントの2つのクラスFirstType、SecondTypeにbeforefieldinit修飾子が付いていない場合、そのクラスが初期化されるのはwhich変数に依存します.
 1 public static void DoSomething(bool which)
 2 {
 3     if (which)
 4     {
 5         FirstType.Foo();
 6     }
 7     else
 8     {
 9         SecondType.Bar();
10     }
11 }

どちらのクラスもFirstType、SecondTypeにbeforefieldinit修飾子が付いている場合(C#ではデフォルトで加算されますが、このタイプが静的構造関数を実現しない限り)、DoSomethingという方法に入ったばかりのときに、この2つのクラスは同時に初期化されます(通常はそうですが、絶対的に保証できません).which変数とは関係ありません.
これも,単一例モードで静的構造関数を使用することを提案した理由である.
 
 
この文書はhttp://stackoverflow.com/questions/610818/what-does-beforefieldinit-flag-doから翻訳された.