22

初期化メソッドを持つ静的クラスが与えられた場合:

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

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

4

4 に答える 4

24

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

ドキュメントから:

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

于 2012-11-29T09:40:25.627 に答える
14

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

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

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

    internal static init()
    {
        // Do some initialization...
    }
}
于 2012-11-29T09:46:41.917 に答える
7

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

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

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

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

于 2012-11-29T09:45:57.670 に答える