C#初始化列表 - 什么时候使用()运算符后的类名?

时间:2013-01-20 10:05:04

标签: c# initializer-list

有时在类名后面指定初始化列表而不使用()运算符:

Cat cat = new Cat { Age = 10, Name = "Fluffy" }

其他时间在()运算符后指定:

List<Cat> cats = new List<Cat>
    {
        new Cat(){ Name = "Sylvester", Age=8 }
    }

我假设差异是因为这里新的Cat()在列表中。但我仍然不明白为什么它应该是不同的。那么为什么差异,以及何时使用哪种语法?

感谢。

3 个答案:

答案 0 :(得分:6)

使用初始化程序列表时,可以在使用无参数构造函数时省略()。新的Cat()在列表中是否无关紧要。

答案 1 :(得分:6)

当没有默认(无参数)构造函数时,必须指定() - 必须提供参数。

当类具有默认构造函数(或无参数构造函数)时,使用初始化程序时始终可以省略()。编译器为您提供了神奇的功能,您可以将事物视为 - 编译器为您插入它们。

答案 2 :(得分:0)

您决定使用哪两个没有真正的区别。比较这两个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 };

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