在C#中初始化一个结构数组

我怎样才能尽可能清楚地初始化const / static结构数组?

class SomeClass { struct MyStruct { public string label; public int id; }; const MyStruct[] MyArray = { {"a", 1} {"b", 5} {"q", 29} }; }; 

首先,你真的必须有一个可变的结构? 他们是邪恶的。 同样的公共领域。

除此之外,我只是创build一个构造函数,获取两位数据:

 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<>的构造函数。)

你在使用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" } }; 

默认情况下,除了null之外,不能初始化引用types。 你必须让他们只读。 所以这可以工作;

  readonly MyStruct[] MyArray = new MyStruct[]{ new MyStruct{ label = "a", id = 1}, new MyStruct{ label = "b", id = 5}, new MyStruct{ label = "c", id = 1} }; 

const更改为static readonly ,并像这样初始化它

 static readonly MyStruct[] MyArray = new[] { new MyStruct { label = "a", id = 1 }, new MyStruct { label = "b", id = 5 }, new MyStruct { label = "q", id = 29 } }; 

我会使用一个静态构造函数的类设置静态只读数组的值。

 public class SomeClass { public readonly MyStruct[] myArray; public static SomeClass() { myArray = { {"foo", "bar"}, {"boo", "far"}}; } }