非静的クラスは静的コンストラクタを持つことができることに気づきました:
public class Thing
{
public Thing()
{
Console.WriteLine("non-static");
}
static Thing()
{
Console.WriteLine("static");
}
}
Thing
のインスタンスを初期化すると、静的コンストラクターが最初に呼び出されます。
出力:
静的
非静的
これの必要性は何でしょうか?それを使用して、非静的型のインスタンスの静的フィールドを初期化しますか?
静的コンストラクタを使用するときに考慮すべきことはありますか?
それを使用して、非静的型のインスタンスの静的フィールドを初期化しますか?
静的フィールド(またはあらゆる種類の静的メンバー)がインスタンスに関連付けられていないことを除いて、ほとんどの場合。静的クラスであるか非静的クラスであるかに関係なく、型自体に関連付けられています。
documentation は、静的コンストラクターのいくつかのプロパティをリストします。
- 最初のインスタンスが作成される前、または静的メンバーが参照される前に、静的コンストラクターが自動的に呼び出されてクラスを初期化します。
ここで、「前」とは「直前」を意味し、どちらかが最初に発生したことを意味します。これは、静的コンストラクターが1回のプログラム実行で型ごとに1回だけ呼び出されるためです。
静的コンストラクタを使用するときに考慮すべきことはありますか?
上記のリンクで提供されている完全なリストは次のとおりです。これにより、静的コンストラクタを使用するときに何が期待できるかがわかります。
静的コンストラクターは、アクセス修飾子をとったり、パラメーターを持たない。
最初のインスタンスが作成される前、または静的メンバーが参照される前に、静的コンストラクターが自動的に呼び出されてクラスを初期化します。
静的コンストラクターを直接呼び出すことはできません。
静的コンストラクターがプログラムで実行されるタイミングをユーザーが制御することはできません。
静的コンストラクターの一般的な使用法は、クラスがログファイルを使用し、コンストラクターを使用してこのファイルにエントリを書き込む場合です。
静的コンストラクターは、アンマネージコードのラッパークラスを作成する場合、コンストラクターが
LoadLibrary
メソッドを呼び出すことができる場合にも役立ちます。静的コンストラクターが例外をスローした場合、ランタイムは2度目を呼び出さず、プログラムが実行されているアプリケーションドメインの存続期間中、型は初期化されないままになります。
非静的メンバーにアクセスしようとしないことを確認することに加えて、インスタンスコンストラクターにいないので、静的コンストラクターは常にプログラム実行中の特定の時間に呼び出されることを考慮する必要があります。述べたように、「最初のインスタンスが作成されるか、静的メンバーが参照されるか」を制御する以外に、これを制御することはできません。
MSDNから リンク :
最初のインスタンスが作成される前、または静的メンバーが参照される前に、静的コンストラクターが自動的に呼び出されてクラスを初期化します。
あなたが述べたように、それは静的フィールドを初期化するために使用されます。クラスのインスタンスを作成するまで、静的でないフィールドは初期化されません。
これを使用して、クラスの静的メンバーを初期化または呼び出します。
これは個人的な経験からの主観的な回答ですが、クラスのメンバーが依存する可能性のある、クラス外の他の静的変数の初期化を確実にするために使用することもできます。
BoltClockのユニコーンで述べたように。
しかし、Niceの追加は、それを使用してシングルトンニースを実装することも簡単にできることです。
public sealed class Singleton
{
private static readonly Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton()
}
public static Singleton Instance
{
get
{
return instance;
}
}
}
詳細は http://www.codeproject.com/Articles/90896/Singletons-in-C-Static-Constructor-vs-Static-Initi にあります。