web-dev-qa-db-ja.com

Main()メソッドの前にC#で静的初期化メソッドを実行するにはどうすればよいですか?

イニシャライザメソッドを持つ静的クラスが与えられた場合:

_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();
_

これは機能しますか、それとも予期しない警告がありますか?そして、これを行うためのより良い方法はありますか?

16
Matt

Fooの-​​ 静的コンストラクター 内で初期化を行うだけです。

ドキュメントから:

静的コンストラクターは、最初のインスタンスが作成される前、または静的メンバーが参照される前に、クラスを初期化するために自動的に呼び出されます。

17
Jon

使用できるC#には 静的コンストラクター があります。

public static class Foo
{
    // Class members...

    static Foo(){
        init();
        // other stuff
    }

    internal static init()
    {
        // Do some initialization...
    }
}
10
João Simões

コードをinternal staticメソッドから staticコンストラクター に次のように移動します。

public static class Foo
{
  // Class members...

  static Foo()
  {
    // Do some initialization...
  }
}

このようにして、インスタンスの構築であろうと静的メンバーへのアクセスであろうと、静的コンストラクターがFooクラスの最初の言及で実行されることを確信できます。

5
SWeko

クラスの静的コンストラクターに初期化コードを配置します

static Foo()
{
    // Initialization code
}

このコンストラクターは、クラスに最初にアクセスしたときに実行されます。

RunClassConstructorを使用して、クラスを使用する前にクラスの静的コンストラクターをトリガーできます。これは、たとえば、このクラスがIOCコンテナまたはこのようなものに自分自身を登録する場合に役立ちます。

RuntimeHelpers.RunClassConstructor(typeof(Foo).TypeHandle);

RuntimeHelpersSystem.Runtime.CompilerServices名前空間にあります。