2012-03-04 6 views
1

私がしたいことは本当に基本的なものだと思います。コード例はそれをはっきりと示しています。パブリッククラスメンバ配列をクラス外から初期化する

class MyClass{ 
    public string[] Bar; 
} 

MyClass Foo = new MyClass(); 
Foo.Bar = { "word", "word", "word" }; 

このコードは、Visual Studio C#でエラーが表示されます。 (代入、呼び出し、増分、減分、および新しいオブジェクト式のみをステートメントとして使用できます)

クラスに配列を追加する方法はありますか?配列はconstになります。

外部からクラスに(const)配列を提供するにはどうすればよいですか?

私はコンストラクタを使いたくありません。なぜなら、配列はオプションでなければならないからです。

答えて

5

にのみ(これは明示的に配列型を指定しなければならない)宣言の一部としてnewオペレータなし{}を使用して配列を初期化することができます。これは、同じクラスでかいないのかどうかとは何の関係もありません:

int[] x = { 1, 2, 3 }; // Fine 
x = { 4, 5, 6 }; // Fail 
x = new[] { 7, 8, 9 }; // Implicitly typed array as of C# 3 
x = new int[] { 10, 11, 12 }; // Works with all versions of C# 

参照のセクション12.6(配列初期化子)、10.5(フィールド宣言)、8.5.1(ローカル変数宣言)と7.6.10.4(配列C#4仕様の作成式)を参照してください。

Darinの投稿にあなたのコメントを答えるには:いいえ、私はあなたが意味すると思うどんな意味でも "const"配列のようなものはありません。唯一の読み取り専用変数ます

private static readonly int[] Values = { 1, 2, 3 }; 

:あなたはこのような配列変数読み取り専用を作る場合でも。Valuesは常に同じ配列オブジェクトを参照します(したがって、常に3つの要素を持ちます)が、配列自体は常に変更可能です。あなたは読み取り専用のコレクションを構築したい場合は、私はおそらくList.AsReadOnly()を経由して、ReadOnlyCollection<T>を使用することをお勧めしたい:

private static readonly ReadOnlyCollection<int> Values = 
    new List<int> { 1, 2, 3 }.AsReadOnly(); 
4

正しいarray initializer構文は次のとおりです。

Foo.Bar = new[] { "word", "word", "word" }; 

あなたが明示的に左手側にタイプを指定した場合にのみ、{ "word", "word", "word" }を使用することができます。

string[] foo = { "word", "word", "word" }; 
+0

ありがとうございます。しかし** const **配列を作る方法はありますか? – danijar

+0

@sharethis、const配列はどういう意味ですか? –

+0

パフォーマンス上の理由から定数になる可能性があります。私は再びそれを変更したくない。 – danijar

0

は括弧の前に新しい[]を追加します。

Foo.Bar = new[] { "word", "word", "word" }; 
1

また、あなたは一度だけあなたの配列を初期化したい場合は

MyClass Foo = new MyClass{Bar = new []{ "word", "word", "word" }}; 

読み取り専用としてそれを定義し、コンストラクタで初期化を実行します:Fooの作成では、この初期化を行う

class MyClass{ 
    public readonly string[] Bar; 
    public MyClass(string[] bar) 
     { 
      Bar = bar; 
     } 
} 

MyClass Foo = new MyClass (new[] { "word", "word", "word" }); 

編集:あなたが好きではない場合あなたがlockを追加する場合

class MyClass 
{ 
    private static string[] bar; 
    public static string[] Bar 
    { 
     get { return bar; } 
     set 
     { 
      if (bar == null) 
       bar = value; 
     } 
    } 
} 

しかし:あなたは半 Singletonパターンなどを使用することができ、あなたのコンストラクタでそれを初期化ステートメントはスレッドセーフですが、パフォーマンスが低下する可能性があります。

0

あなたはconstの配列を作成し、その宣言よりも、それはどこにも他の初期化できません。コンストラクタで初期化できる配列readonlyを作成することができます。配列の値を別の場所に設定する場合は、通常のデータフィールドである必要があります。