圆括号与否? 有什么不同?

我最近看到过这两件事,我有点困惑。

var blah = new MyClass() { Name = "hello" } 

 var blah = new MyClass { Name = "hello" } 

有什么不同? 为什么他们都工作?

更新:这是否意味着,如果我在构造函数中有一些东西做了一些计算,我将不得不调用第一个?

据我所知,它们完全相同。 只要您使用大括号(即对象初始化程序的语法),C#规范(或至少Microsoft的实现)允许您在使用默认构造函数(无参数)时省略()。 请注意,对象初始化程序在这里对构造函数没有任何区别 – new MyClass位仍然被单独解释为对默认构造函数的调用。 就个人而言,我建议你总是包括圆括号()以保持一致性 – 当你没有跟随对象初始化器时你需要它们。

没有区别,首先只是指出你也在调用构造函数:

 class Ö { public string Ä { get; set; } public string Å { get; set; } public Ö() { Å = "dear";} public Ö(string å) { Å = å; } } Console.WriteLine(new Ö { Ä = "hello" }.Å); Console.WriteLine(new Ö("world") { Ä = "hello" }.Å); 

将导致:

 dear world 

要添加上述注释,添加额外内容肯定有助于阐明正在调用的构造函数或init方法。 绝对是造型方面也….

我猜他们保留了对象初始值设定项的()forms,因为有些用户喜欢用于调用构造函数的()的清晰度,但是iirc,C ++(或者第一个版本)允许在没有括号的情况下调用构造函数。 我的第二个猜测是,他们(语言设计师)倾向于使C#具有类似JSON的结构,这有点整洁,因此它们便于在没有()的情况下调用构造函数。 我赞成第二种forms。

没有什么区别,就像VB.NET的属性(虽然如此糟糕)允许你以两种forms分配变量:button1.Height = 100 button1.Height()= 1000 Kinda lame,如果你可能会问。

实际上,在处理没有默认空构造函数的类型之前,它们没有太大区别。 在这种情况下,您可以获得诸如“new SomeClass(MandatoryArgument){Prop1 = 1,Prop2 = 2}”之类的好处。