54

構造体の const / static 配列をできるだけ明確に初期化するにはどうすればよいですか?

class SomeClass
{

    struct MyStruct
    {
        public string label;
        public int id;
    };

    const MyStruct[] MyArray = {
          {"a", 1}
          {"b", 5}
          {"q", 29}
    };
};
4

5 に答える 5

57

まず、本当に変更可能な構造体が必要ですか? 彼らはほとんどの場合、悪い考えです。パブリック フィールドも同様です。それらが合理的である非常にまれなコンテキストがいくつかあります(通常、 のように両方の部分が一緒にValueTupleなります)が、私の経験ではかなりまれです。

それ以外は、2 ビットのデータを受け取るコンストラクターを作成するだけです。

class SomeClass
{

    struct MyStruct
    {
        private readonly string label;
        private readonly int id;

        public MyStruct (string label, int id)
        {
            this.label = label;
            this.id = id;
        }

        public string Label { get { return label; } }
        public string Id { get { return id; } }

    }

    static readonly IList<MyStruct> MyArray = new ReadOnlyCollection<MyStruct>
        (new[] {
             new MyStruct ("a", 1),
             new MyStruct ("b", 5),
             new MyStruct ("q", 29)
        });
}

配列自体を公開する代わりにReadOnlyCollectionを使用することに注意してください。これにより配列が不変になり、配列を直接公開する際の問題が回避されます。(コード ショーは、構造体の配列を初期化します。次に、参照を のコンストラクターに渡すだけですReadOnlyCollection<>。)

于 2008-11-21T17:18:47.370 に答える
28

C# 3.0 を使用していますか? 次のようにオブジェクト初期化子を使用できます。

static MyStruct[] myArray = 
            new MyStruct[]{
                new MyStruct() { id = 1, label = "1" },
                new MyStruct() { id = 2, label = "2" },
                new MyStruct() { id = 3, label = "3" }
            };
于 2008-11-21T17:22:16.440 に答える
6

デフォルトでは、null 以外の参照型を初期化できません。それらを読み取り専用にする必要があります。したがって、これはうまくいく可能性があります。

    readonly MyStruct[] MyArray = new MyStruct[]{
      new MyStruct{ label = "a", id = 1},
      new MyStruct{ label = "b", id = 5},
      new MyStruct{ label = "c", id = 1}
    };
于 2008-11-21T17:24:27.840 に答える
-3

静的読み取り専用配列の値を設定するクラスで静的コンストラクターを使用します。

public class SomeClass
{
   public readonly MyStruct[] myArray;

   public static SomeClass()
   {
      myArray = { {"foo", "bar"},
                  {"boo", "far"}};
   }
}
于 2008-11-21T17:41:25.873 に答える