次のコードが与えられた場合:
public static class Helpers
{
private static Char[] myChars = new Char[] {'a', 'b'};
private static Int32 myCharsSize = myChars.Length;
}
その長さを使用してに割り当てる前myChars
に、が初期化されることが保証されていますか?myCharsSize
次のコードが与えられた場合:
public static class Helpers
{
private static Char[] myChars = new Char[] {'a', 'b'};
private static Int32 myCharsSize = myChars.Length;
}
その長さを使用してに割り当てる前myChars
に、が初期化されることが保証されていますか?myCharsSize
はい、そうします。C# 仕様の 15.5.6.2 節を参照してください。
クラスの静的フィールド変数初期化子は、クラス宣言 (§15.5.6.1) に現れるテキストの順序で実行される割り当てのシーケンスに対応します。部分クラス内では、「テキストの順序」の意味は §15.5.6.1 で指定されています。クラスに静的コンストラクター (§15.12) が存在する場合、静的フィールド初期化子の実行は、その静的コンストラクターを実行する直前に行われます。それ以外の場合、静的フィールド初期化子は、そのクラスの静的フィールドを最初に使用する前に、実装に依存する時点で実行されます。
そうは言っても、静的型初期化子(静的コンストラクター)内で初期化を行う方が良いと思います。
うーん...私はそれがコンパイルされることに驚いています(そうです、私はチェックしました)。これを安全にする保証はありません。静的コンストラクターを使用します...
編集:それが機能することを受け入れます(上記のより良い回答を参照)。しかし、コードに関する私の考えは、コードをできるだけ単純かつ明白に保つことです。それが機能することが明らかでない場合(そして、あなたが尋ねなければならない場合はそうではありません)、そのように書かないでください...
特に、フィールドの順序に依存する問題:
partial
コードをクラスに分割すると壊れる可能性があります私のアドバイスはそのままです。このシナリオでは静的コンストラクターを使用してください。
一見、よくわからないので、これを試して、コンパイルできるかどうかを確認する必要がありました。
その場合、静的コンストラクターで値を初期化します。