52

次のコードが与えられた場合:

public static class Helpers
{
   private static Char[] myChars = new Char[] {'a', 'b'};

   private static Int32 myCharsSize = myChars.Length;
}

その長さを使用してに割り当てるmyCharsに、が初期化されることが保証されていますか?myCharsSize

4

3 に答える 3

62

はい、そうします。C# 仕様の 15.5.6.2 節を参照してください。

クラスの静的フィールド変数初期化子は、クラス宣言 (§15.5.6.1) に現れるテキストの順序で実行される割り当てのシーケンスに対応します。部分クラス内では、「テキストの順序」の意味は §15.5.6.1 で指定されています。クラスに静的コンストラクター (§15.12) が存在する場合、静的フィールド初期化子の実行は、その静的コンストラクターを実行する直前に行われます。それ以外の場合、静的フィールド初期化子は、そのクラスの静的フィールドを最初に使用する前に、実装に依存する時点で実行されます。

そうは言っても、静的型初期化子(静的コンストラクター)内で初期化を行う方が良いと思います。

于 2009-09-29T20:27:31.957 に答える
17

うーん...私はそれがコンパイルされることに驚いています(そうです、私はチェックしました)。これを安全にする保証はありません。静的コンストラクターを使用します...


編集:それが機能することを受け入れます(上記のより良い回答を参照)。しかし、コードに関する私の考えは、コードをできるだけ単純かつ明白に保つことです。それが機能することが明らかでない場合(そして、あなたが尋ねなければならない場合はそうではありません)、そのように書かないでください...

特に、フィールドの順序に依存する問題:

  • コードを移動すると壊れる可能性があります(私はよくそうします)
  • partialコードをクラスに分割すると壊れる可能性があります

私のアドバイスはそのままです。このシナリオでは静的コンストラクターを使用してください。

于 2009-09-29T20:27:44.813 に答える
0

一見、よくわからないので、これを試して、コンパイルできるかどうかを確認する必要がありました。

その場合、静的コンストラクターで値を初期化します。

于 2009-09-29T20:29:21.473 に答える