構造体のconst/static配列をできるだけ明確に初期化するにはどうすればよいですか?
class SomeClass
{
struct MyStruct
{
public string label;
public int id;
};
const MyStruct[] MyArray = {
{"a", 1}
{"b", 5}
{"q", 29}
};
};
まず、実際に可変構造が必要ですか?彼らはほとんど常に悪い考えです。同様にパブリックフィールド。合理的である(通常はValueTuple
のように両方の部分が一緒になっている)非常にまれなコンテキストがいくつかありますが、私の経験ではかなりまれです。
それ以外は、2ビットのデータを取得するコンストラクタを作成するだけです。
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 }
};