English 中文(简体)
在C#中初始化一个结构体数组
原标题:
  • 时间:2008-11-21 17:09:14
  •  标签:

我该如何尽可能清晰地初始化一个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 }
};




相关问题
热门标签