【问题标题】: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 }”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-26
          • 2018-10-13
          • 2016-10-01
          • 1970-01-01
          • 2012-04-05
          • 2020-07-02
          • 2010-10-20
          相关资源
          最近更新 更多