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