有时在类名后面指定初始化列表而不使用()运算符:
Cat cat = new Cat { Age = 10, Name = "Fluffy" }
其他时间在()运算符后指定:
List<Cat> cats = new List<Cat>
{
new Cat(){ Name = "Sylvester", Age=8 }
}
我假设差异是因为这里新的Cat()在列表中。但我仍然不明白为什么它应该是不同的。那么为什么差异,以及何时使用哪种语法?
感谢。
答案 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 };
即使构造函数中需要参数,只要提供它们,您仍然可以使用这种初始化方式。