C#初始值设定项列表-何时在类名后使用()运算符?

C#初始值设定项列表-何时在类名后使用()运算符?,c#,initializer-list,C#,Initializer List,有时,在类名之后指定初始值设定项列表,而不使用()运算符: Cat cat = new Cat { Age = 10, Name = "Fluffy" } List<Cat> cats = new List<Cat> { new Cat(){ Name = "Sylvester", Age=8 } } 其他情况下,在()运算符之后指定: Cat cat = new Cat { Age = 10, Name = "Fluffy" } L

有时,在类名之后指定初始值设定项列表,而不使用()运算符:

Cat cat = new Cat { Age = 10, Name = "Fluffy" }
List<Cat> cats = new List<Cat>
    {
        new Cat(){ Name = "Sylvester", Age=8 }
    }
其他情况下,在()运算符之后指定:

Cat cat = new Cat { Age = 10, Name = "Fluffy" }
List<Cat> cats = new List<Cat>
    {
        new Cat(){ Name = "Sylvester", Age=8 }
    }
List cat=新列表
{
new Cat(){Name=“Sylvester”,Age=8}
}
我假设差异是因为新的Cat()在列表中。但我还是不明白为什么会有所不同。那么为什么会有差异,何时使用哪种语法呢


谢谢。

使用初始值设定项列表时,可以在使用无参数构造函数时忽略()。新的Cat()是否在列表中并不重要。

如果没有默认(无参数)构造函数,则必须指定
()
,如果必须提供参数


当类具有默认构造函数(或无参数构造函数)时,在使用初始值设定项时,始终可以忽略
()
。编译器为您发挥了神奇的作用,您可以将事情想象为-编译器为您插入它们。

您决定使用这两种方法中的哪一种没有真正的区别。比较这两个
Cat
实例:

var catA = new Cat();   // traditional constructor
catA.Name = "Mittens";  // set property

var catB = new Cat { Name = "Not Mittens" }; // all in one initializer
它们在功能上是相同的,只是一个快捷符号。第一种方法是传统方法,大多数面向对象(OO)语言使用构造函数创建对象。C#最近添加了这种新的方法来创建对象和设置属性,以使代码更干净

即使您的类没有无参数构造函数(
new()
),您仍然可以使用
{…}
初始化

考虑这一点:

var dogA = new Dog("Fido");
var dogA.Age = 12;

var dogB = new Dog("Not Fido") { Age = 7 };

即使构造函数中需要参数,只要您提供参数,也可以使用这种初始化方式。

如果没有默认构造函数()将无法工作否?我上面给出的例子来自MSDN,Cat类没有任何构造函数,这意味着有一个默认构造函数。这个答案是错误的,因为它目前是错误的。您不能总是忽略()。“新猫”不起作用。使用初始值设定项列表时可以忽略它。@YechielLabunskiy-不,它不起作用。默认构造函数是在您未指定构造函数时生成的,并且是无参数构造函数。@user1908061-在问题(对象初始值设定项)的上下文中,您始终可以忽略它。@Oded所以您是说在我的示例中没有特定的原因在列表内调用Cat(),但在列表外调用w/o()?这两种方法在这里都是可以接受的,因为Cat没有定义构造函数(这意味着编译器定义了一个默认构造函数),它们的可能重复项不是完全相同的,并且存在差异。阅读了解更多信息。:)