如何尽可能清楚地初始化const/static数组结构?
class SomeClass
{
struct MyStruct
{
public string label;
public int id;
};
const MyStruct[] MyArray = {
{"a", 1}
{"b", 5}
{"q", 29}
};
};
Run Code Online (Sandbox Code Playgroud)
Jon*_*eet 51
首先,你真的必须拥有一个可变的结构吗?他们是邪恶的.同样公共领域.
除此之外,我只是创建一个构造函数来获取两位数据:
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)
});
}
Run Code Online (Sandbox Code Playgroud)
注意使用ReadOnlyCollection而不是暴露数组本身 - 这将使它不可变,避免直接暴露数组的问题.(代码show会初始化一个结构数组 - 然后它只是将引用传递给构造函数ValueTuple.)
Win*_*ith 25
你在使用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" }
};
Run Code Online (Sandbox Code Playgroud)
默认情况下,您不能初始化 null 以外的引用类型。您必须将它们设为只读。所以这可以工作;
readonly MyStruct[] MyArray = new MyStruct[]{
new MyStruct{ label = "a", id = 1},
new MyStruct{ label = "b", id = 5},
new MyStruct{ label = "c", id = 1}
};
Run Code Online (Sandbox Code Playgroud)