一行中的类初始化语法

时间:2016-11-09 09:41:06

标签: c# class

我有以下课程

public class ListCode : List<int>
{
    public string Code { get; set; }
}

可以通过这种方式初始化:

ListCode myList = new ListCode() { 1, 2, 3};
myList.Code = "bar";

但它也可以这样初始化:

ListCode myList = new ListCode() { Code = "bar"};
myList.AddRange(new[] { 1, 2, 3 });

还有一种方法可以在一行中完成吗?像

ListCode myList = new ListCode() { 1, 2, 3, Code = "bar" }; //invalid syntax

3 个答案:

答案 0 :(得分:2)

如果我错了,请纠正我,但这是因为这是语法糖&#39;。两种初始化类型都涉及两种不同的东西..

索引初始化

ListCode myList = new ListCode() { 1, 2, 3};

类似于

ListCode myList = new ListCode();
myList.Add(1); // myList[0] = 1;
myList.Add(2); // myList[1] = 2;
myList.Add(3); // myList[2] = 3;

财产初始化

ListCode myList = new ListCode() { Code = "bar"};

相同
ListCode myList = new ListCode();
myList.Code = "bar";

您不能将这些混合起来,因为编译器将它们解释为一个或另一个。

然而,这是可能的......

public class ListCode : List<int>
{
    public ListCode(string code)
    {
        this.Code = code;
    }
    public string Code { get; set; }
}  

...

ListCode myList = new ListCode("bar") { 1, 2, 3 };

答案 1 :(得分:2)

您可以实现一个也由List实现的附加构造函数(传递IEnumerable)

public class ListCode : List<int>
{
    public ListCode(IEnumerable<int> content) : base(content) { }
    public string Code { get; set; }
}

这允许您将内容作为参数传递给构造函数,并且您可以使用其他属性初始化进行实例化

var t = new ListCode(new [] { 1, 2, 3 }) { Code = "test" };

答案 2 :(得分:2)

根据评论中的引用似乎不可能做,但我可以建议使用构造函数参数:

public class ListCode : List<int>
{
    public ListCode(string code)
    {
        Code = code;
    }

    public string Code { get; set; }
}

ListCode myList = new ListCode("bar") { 1, 2, 3};

这似乎是最干净的:)