我最近看到过这两件事,我有点困惑。
var blah = new MyClass() { Name = "hello" }
和
var blah = new MyClass { Name = "hello" }
区别是什么?为什么他们都工作?
更新 这是否意味着如果我在构造函数中有某些东西进行某些计算,我将不得不调用第一个?
答案 0 :(得分:15)
据我所知,它们完全相同。 C#规范(或至少是Microsoft的实现)允许您在使用默认构造函数(无参数)时省略(),只要您使用大括号(即object initialisers的语法)即可。请注意,对象初始化程序在这里对构造函数没有任何区别 - new MyClass
位仍然被单独解释为对默认构造函数的调用。就个人而言,我建议你总是包括圆括号()以保持一致性 - 当你没有跟随对象初始值设定项时,需要它们。
答案 1 :(得分:3)
没有区别,首先只是指出你 也在调用构造函数:
class Ö {
public string Ä { get; set; }
public string Å { get; set; }
public Ö() { Å = "dear";}
public Ö(string å) { Å = å; }
}
Console.WriteLine(new Ö { Ä = "hello" }.Å);
Console.WriteLine(new Ö("world") { Ä = "hello" }.Å);
将导致:
dear
world
答案 2 :(得分:1)
要添加上述注释,添加额外内容肯定有助于阐明正在调用的构造函数或init方法。绝对是造型方面......
答案 3 :(得分:1)
我猜他们保留了对象初始值设定项的()形式,因为有些用户喜欢用于调用构造函数的()的清晰度,但是iirc,C ++(或第一个版本)允许在没有括号的情况下调用构造函数。我的第二个猜测是,他们(语言设计师)倾向于使C#具有类似JSON的结构,这有点整洁,因此它们便于在没有()的情况下调用构造函数。我赞成第二种形式。
没有区别,就像VB.NET的属性(虽然如此糟糕)允许你以两种形式分配变量:button1.Height = 100 button1.Height()= 1000 Kinda lame,如果你可能会问。
答案 4 :(得分:1)
实际上,在处理没有默认空构造函数的类型之前,它们没有太大区别。在这种情况下,你可以获得一些好处,例如“new SomeClass(MandatoryArgument){Prop1 = 1,Prop2 = 2}”