イニシャライザメソッドを持つ静的クラスが与えられた場合:
_public static class Foo
{
// Class members...
internal static init()
{
// Do some initialization...
}
}
_
イニシャライザがMain()
の前に実行されていることを確認するにはどうすればよいですか?
私が考えることができる最善の方法は、これをFoo
に追加することです。
_ private class Initializer
{
private static bool isDone = false;
public Initializer()
{
if (!isDone)
{
init();
isDone = true;
}
}
}
private static readonly Initializer initializer = new Initializer();
_
これは機能しますか、それとも予期しない警告がありますか?そして、これを行うためのより良い方法はありますか?
Foo
の- 静的コンストラクター 内で初期化を行うだけです。
ドキュメントから:
静的コンストラクターは、最初のインスタンスが作成される前、または静的メンバーが参照される前に、クラスを初期化するために自動的に呼び出されます。
使用できるC#には 静的コンストラクター があります。
public static class Foo
{
// Class members...
static Foo(){
init();
// other stuff
}
internal static init()
{
// Do some initialization...
}
}
コードをinternal static
メソッドから static
コンストラクター に次のように移動します。
public static class Foo
{
// Class members...
static Foo()
{
// Do some initialization...
}
}
このようにして、インスタンスの構築であろうと静的メンバーへのアクセスであろうと、静的コンストラクターがFoo
クラスの最初の言及で実行されることを確信できます。
クラスの静的コンストラクターに初期化コードを配置します
static Foo()
{
// Initialization code
}
このコンストラクターは、クラスに最初にアクセスしたときに実行されます。
RunClassConstructor
を使用して、クラスを使用する前にクラスの静的コンストラクターをトリガーできます。これは、たとえば、このクラスがIOCコンテナまたはこのようなものに自分自身を登録する場合に役立ちます。
RuntimeHelpers.RunClassConstructor(typeof(Foo).TypeHandle);
RuntimeHelpers
はSystem.Runtime.CompilerServices
名前空間にあります。