我应该如何以最清晰的方式初始化一个const/static结构体数组?
class SomeClass
{
struct MyStruct
{
public string label;
public int id;
};
const MyStruct[] MyArray = {
{"a", 1}
{"b", 5}
{"q", 29}
};
};
首先,你真的需要一个可变结构体吗?它们几乎总是不好的选择。同样,公共字段也是如此。有一些非常偶然的情况下它们是合理的(通常都是两个部分一起使用,例如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代替直接暴露数组 - 这将使其成为不可变的,避免直接暴露数组可能导致的问题。(代码示例初始化了一个结构体数组 - 然后只是将引用传递给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之外,您不能默认初始化引用类型。您必须使它们只读。因此,可以这样做;
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"}};
}
}
struct foo { int i; const char* str; char c; }; foo f[] = { { 1, "hello", 'c' }, { 2, "goodbye", 'd'" }};
如果不需要编写构造函数或者经常输入"new foo"就更好了。 - Bklynnew[] { new MyStruct ("a", 1), new MyStruct ("b", 5), new MyStruct ("q", 29) }
是做什么的?它是用来初始化一个数组的。 - Jon Skeet