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

时间:2009-03-21 01:33:39

标签: c# asp.net class conventions

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

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

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

区别是什么?为什么他们都工作?

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

5 个答案:

答案 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}”