C# 一行中的类初始化语法

C# 一行中的类初始化语法,c#,class,C#,Class,我有以下课程 public class ListCode : List<int> { public string Code { get; set; } } 但它也可以这样初始化: ListCode myList = new ListCode() { Code = "bar"}; myList.AddRange(new[] { 1, 2, 3 }); 有没有一种方法可以在同一行中实现这一点?像 ListCode myList = new ListCode() { 1, 2,

我有以下课程

public class ListCode : List<int>
{
    public string Code { get; set; }
}
但它也可以这样初始化:

ListCode myList = new ListCode() { Code = "bar"};
myList.AddRange(new[] { 1, 2, 3 });
有没有一种方法可以在同一行中实现这一点?像

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

如果我错了,请纠正我,因为这是“语法糖”。两种初始化器类型都处理两个不同的问题

索引初始化 类似于

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();
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 };
公共类列表code:List
{
公共列表代码(字符串代码)
{
这个。代码=代码;
}
公共字符串代码{get;set;}
}  
...
listcodemylist=新的ListCode(“bar”){1,2,3};

您可以实现一个附加的构造函数,该构造函数也是通过List实现的(传递IEnumerable)


根据注释中的引用似乎不可能做到这一点,但我可以建议为此使用构造函数参数:

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

    public string Code { get; set; }
}

ListCode myList = new ListCode("bar") { 1, 2, 3};
公共类列表code:List
{
公共列表代码(字符串代码)
{
代码=代码;
}
公共字符串代码{get;set;}
}
listcodemylist=新的ListCode(“bar”){1,2,3};

这似乎是你能得到的最干净的:)

相同,应该是
相似。一个显著的区别是,对于初始值设定项,对象“在一边”创建,然后分配给变量-如果初始化代码引发异常,则会有区别。
ListCode myList=new ListCode(){1,2,3}不能与
ListCode myList=new ListCode()相同;myList[0]=1因为它抛出了一个
ArgumentOutOfRangeException
小缺点:如果您希望对多个属性进行属性初始化,那么这将不再有效……是的,我看到您的答案,它就像反向版本:)但这当然取决于附加属性的可能性,哪一个更好。顺便说一下,您可以删除
int
,使其更短
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 };
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" };
public class ListCode : List<int>
{
    public ListCode(string code)
    {
        Code = code;
    }

    public string Code { get; set; }
}

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