【问题标题】:Round brackets or not? Whats the difference?圆括号与否?有什么不同?
【发布时间】:2009-03-21 01:33:39
【问题描述】:
最近看到这两件事,有点迷茫。
var blah = new MyClass() { Name = "hello" }
和
var blah = new MyClass { Name = "hello" }
有什么区别?为什么它们都有效?
更新:
这是否意味着如果我在构造函数中有一些东西可以进行一些计算,我将不得不调用第一个??
【问题讨论】:
标签:
c#
asp.net
class
conventions
【解决方案1】:
据我所知,它们是完全等价的。只要您使用大括号(即object initialisers 的语法),C# 规范(或至少 Microsoft 的实现)允许您在使用默认构造函数(无参数)时省略 ()。请注意,对象初始值设定项对这里的构造函数没有任何影响——new MyClass 位仍然被单独解释为对默认构造函数的调用。就个人而言,我建议您始终包含圆括号 () 以保持一致性 - 当您后面没有对象初始化程序时,您需要它们。
【解决方案2】:
没有区别,第一种形式只是指出您正在也调用构造函数:
class Ö {
public string Ä { get; set; }
public string Å { get; set; }
public Ö() { Å = "dear";}
public Ö(string å) { Å = å; }
}
Console.WriteLine(new Ö { Ä = "hello" }.Å);
Console.WriteLine(new Ö("world") { Ä = "hello" }.Å);
将导致:
dear
world
【解决方案3】:
要添加到上述 cmets,添加额外的绝对有助于澄清正在调用的构造函数或 init 方法。绝对是造型方面也......
【解决方案4】:
我猜他们为对象初始化器保留了 () 形式,因为一些用户喜欢 () 用于调用构造函数的清晰性,但是 iirc、C++(或第一个版本)允许调用不带括号的构造函数。我的第二个猜测是,他们(语言设计者)倾向于使 C# 具有类似 JSON 的结构,这有点整洁,所以他们便于在没有 () 的情况下调用构造函数。我赞成第二种形式。
没有区别,就像 VB.NET 的属性(尽管如此糟糕)允许您以两种形式分配变量: button1.Height = 100 button1.Height() = 1000 有点蹩脚,如果你问的话。
【解决方案5】:
实际上,除非您处理没有默认空构造函数的类型,否则它们并没有太大区别。在这种情况下,您可以编写类似“new SomeClass(MandatoryArgument) { Prop1 = 1, Prop2 = 2 }”