如何尽可能清楚地初始化const / static数组结构?
class SomeClass
{
struct MyStruct
{
public string label;
public int id;
};
const MyStruct[] MyArray = {
{"a", 1}
{"b", 5}
{"q", 29}
};
};
答案 0 :(得分:50)
首先,你真的必须有一个可变的结构吗?他们几乎总是一个坏主意。同样公共领域。有一些非常偶然的背景,它们是合理的(通常是两部分在一起,就像ValueTuple
一样),但根据我的经验,它们非常罕见。
除此之外,我只是创建一个构造函数来获取两位数据:
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而不是暴露数组本身 - 这将使其不可变,避免the problem exposing arrays directly。 (代码show会初始化一个结构数组 - 然后它只是将引用传递给ReadOnlyCollection<>
的构造函数。)
答案 1 :(得分:24)
您使用的是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" }
};
答案 2 :(得分:4)
默认情况下,您无法初始化引用类型,而不是null。你必须让他们只读。所以这可行;
readonly MyStruct[] MyArray = new MyStruct[]{
new MyStruct{ label = "a", id = 1},
new MyStruct{ label = "b", id = 5},
new MyStruct{ label = "c", id = 1}
};
答案 3 :(得分:0)
将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 }
};
答案 4 :(得分:-2)
我在类上使用静态构造函数来设置静态只读数组的值。
public class SomeClass
{
public readonly MyStruct[] myArray;
public static SomeClass()
{
myArray = { {"foo", "bar"},
{"boo", "far"}};
}
}