当前位置:  开发笔记 > 编程语言 > 正文

在C#中初始化一个结构数组

如何解决《在C#中初始化一个结构数组》经验,为你挑选了2个好方法。

如何尽可能清楚地初始化const/static数组结构?

class SomeClass
{

    struct MyStruct
    {
        public string label;
        public int id;
    };

    const MyStruct[] MyArray = {
          {"a", 1}
          {"b", 5}
          {"q", 29}
    };
};

Jon Skeet.. 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 MyArray = new ReadOnlyCollection
        (new[] {
             new MyStruct ("a", 1),
             new MyStruct ("b", 5),
             new MyStruct ("q", 29)
        });
}

注意使用ReadOnlyCollection而不是暴露数组本身 - 这将使它不可变,避免直接暴露数组的问题.(代码show会初始化一个结构数组 - 然后它只是将引用传递给构造函数ValueTuple.)



1> Jon Skeet..:

首先,你真的必须拥有一个可变的结构吗?他们是邪恶的.同样公共领域.

除此之外,我只是创建一个构造函数来获取两位数据:

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 MyArray = new ReadOnlyCollection
        (new[] {
             new MyStruct ("a", 1),
             new MyStruct ("b", 5),
             new MyStruct ("q", 29)
        });
}

注意使用ReadOnlyCollection而不是暴露数组本身 - 这将使它不可变,避免直接暴露数组的问题.(代码show会初始化一个结构数组 - 然后它只是将引用传递给构造函数ValueTuple.)


很遗憾,这里有额外的打字.在C++ 11中,我可以这样做:`struct foo {int i; const char*str; char c; }; foo f [] = {{1,"hello","c"},{2,"goodbye","d""}};`如果一个人不需要编写构造函数或者必须输入"new foo"这么多.
@Chris:不,我说它远远超出了公共消费品API.你的团队有多大?你总是*为那家公司工作吗?你有多确定*你的团队中的每个成员*现在和永远都能理解可变结构的许多不同的奇怪之处?对于一次性代码,我同意......但是大多数代码在维护模式下的寿命比我们原先预期的要长得多,而糟糕的设计可能会让以后更难解开.你发现有人通过引用传递了一个字段然后你*不能*重构属性而不会破坏它等等.
@Jon Skeet:我有一个问题.考虑到标签和id是只读的,是否有任何理由允许只访问它们而不是让它们公开?编译器是否对其进行优化,或者通过访问器访问它们是否有将访问它们作为公共字段的开销?

2> Winston Smit..:

你在使用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" }
            };


使用C#3,你不需要为每个构造函数调用(),因为你正在使用一个对象初始化程序,并且你可以抛弃"新的MyStruct []"位,因为它是一个数组变量的初始化器所暗示的.
推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有