3

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

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

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

有什么不同?为什么它们都起作用?

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

4

5 回答 5

15

据我所知,它们是完全等价的。只要您使用大括号(即对象初始化器的语法),C# 规范(或至少 Microsoft 的实现)允许您在使用默认构造函数(无参数)时省略 ( )。请注意,对象初始值设定项对这里的构造函数没有影响——该new MyClass位仍然被单独解释为对默认构造函数的调用。就个人而言,我建议您始终包含圆括号 () 以保持一致性 -当您没有跟随对象初始值设定项时,您需要它们。

于 2009-03-21T01:37:54.400 回答
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
于 2009-03-21T01:49:23.200 回答
1

要添加到上述评论,添加额外的绝对有助于澄清正在调用的构造函数或 init 方法。绝对是造型方面也......

于 2009-03-21T02:09:57.940 回答
1

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

没有区别,就像 VB.NET 的属性(尽管如此糟糕)允许您以两种形式分配变量: button1.Height = 100 button1.Height() = 1000 有点蹩脚,如果你问的话。

于 2009-03-21T02:14:31.627 回答
1

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

于 2009-03-21T13:48:04.643 回答