5

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

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

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

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

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

谢谢。

4

3 回答 3

6

当您使用初始化列表时,您可以省略 (),当使用无参数构造函数时。new Cat() 是否在列表中都没有关系。

于 2013-01-20T10:09:36.717 回答
6

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

当类具有默认构造函数(或无参数构造函数)时,您始终可以()在使用初始值设定项时省略 。编译器为你做了魔法,你可以把事情想象成 - 编译器为你插入它们。

于 2013-01-20T10:09:44.920 回答
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 };

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

于 2013-01-20T10:24:05.220 回答