2011-01-24 28 views
2

静的読み取り専用パラメータの初期化の指定はありますか?順序初期化静的パラメータ

次の例では、配列は常に6の長さで作成されますか?

public class Foo { 
    private static readonly int MAX_STACKSIZE = 6; 
    private static readonly int[] m_stack = new int[MAX_STACKSIZE]; 
} 

それとも MAX_STACKSIZE前を初期化されてm_stackのチャンスはありますか?

@Editは:静的読み取り専用に

+3

これをコンパイルしようとしましたか? –

+2

順序は問題ではありません。サイクルがない限り、動作します。しかし、あなたは 'int []'の非ヌル定数を持つことはできません。静的な読み取り専用フィールドにする必要があります。 – CodesInChaos

+0

私は前にそれをチェックしていたはずです;;)質問 – user492238

答えて

6

EDITをのconstを変更:サンプルコードは "CONST" の代わりに "静的な読み取り専用" に含まれている場合は、この答えは書かれていました。現在のバージョンの質問では有効ではありません。ある時点でそれに対処する別の答えを書くかもしれませんが、今は時間がありません。

const int[]をnull以外に設定することはできないため、これはC#でも有効ではありません。

しかし、より一般的なケースでは、C#の仕様のセクション10.4が適用されます。

定数依存性が円形の性質のものではない限り、同じプログラム内の他の定数に依存することを許可されています。コンパイラは自動的に定数宣言を適切な順序で評価します。

それから、次の例を示します:

class A 
{ 
    public const int X = B.Z + 1; 
    public const int Y = 10; 
} 

class B 
{ 
    public const int Z = A.Y + 1; 
} 

と言う...

コンパイラは最初に、値10を生成する、BZを評価し、最終的にはAXを評価し、AYを評価、11と12の順である。

+0

"const int []をnull以外に設定することはできないため、これはC#でも有効ではありません。 - >問題はローカルconstパラメータで最初に(不正確に)与えられました。それらを静的読み取り専用に編集しました。アーカイブのためだけです... – user492238

+0

@ user492238:静的な読み取り専用フィールドは定数ではないので、これは完全に質問を無効にしています。私が引用したC#仕様のビットはもはや適用されません! –