静的コンストラクターを含むクラスがある場合、そのクラスを含むアセンブリが最初にロードされたとき、またはそのクラスへの最初の参照がヒットしたときに、そのコンストラクターが呼び出されますか?
回答:
クラスに初めてアクセスしたとき。
静的コンストラクターは、静的データを初期化するため、または1回だけ実行する必要がある特定のアクションを実行するために使用されます。最初のインスタンスが作成される前、または静的メンバーが参照される前に、自動的に呼び出されます。
A static constructor is used to initialize any static data
番号。static initializer
静的なものを初期化するために使用する方が良いです。
簡単なドキュメントにもかかわらず、期待するほど単純ではありません。Jon Skeetの記事http://csharpindepth.com/Articles/General/Beforefieldinit.aspxで、この質問について詳しく説明します。
概要:
静的コンストラクターはすぐに実行されることが保証されています、そのクラスのメンバーへの最初の参照のに-インスタンスの作成またはクラスの独自の静的メソッド/プロパティ。
静的イニシライザー(静的コンストラクターがない場合)は、特定のフィールドを最初に参照する前であればいつでも実行されることが保証されていることに注意してください。
静的コンストラクターは、クラスで何かを使用する前に呼び出されますが、それがいつ発生するかは実装次第です。
最初の静的メンバーにアクセスする前、および最初のインスタンスが作成される前に呼び出されることが保証されています。クラスが使用されない場合、静的コンストラクターが呼び出される保証はまったくありません。
静的コンストラクターには他の場所で答えられる落とし穴があるようですが、簡単な説明に消化するのに時間がかかりました。すべてのドキュメントと説明では、静的コンストラクター/イニシャライザーは、最初のクラスがインスタンス化される前、または最初の静的フィールドが参照される前に実行されることが「保証」されていると主張しています。それ自体のインスタンス(ニワトリ/卵)を作成するクラスに静的シングルトンを配置しようとすると、落とし穴が発生します。この場合、静的コンストラクターはインスタンスコンストラクターの後に呼び出されることになります。私の場合、インスタンスコンストラクターには静的データに依存するコードが含まれていました。
インスタンスコンストラクターの後に呼び出される静的コンストラクター?
静的コンストラクターは、非静的コンストラクターの後に実行できます。これはコンパイラのバグですか?
(私にとっての答えは、シングルトンを別のクラスに配置するか、必要になる前にインスタンスコンストラクターで静的データを手動で初期化することでした)