【问题标题】:Different kinds of object initialization不同类型的对象初始化
【发布时间】:2011-03-01 23:04:00
【问题描述】:

嗨 我想知道像这样初始化对象是否有任何区别

MyClass calass = new MyClass()
{
  firstProperty = "text",
  secondProperty = "text"
}

并像这样初始化对象

MyClass calass = new MyClass   // no brackets
{
  firstProperty = "text",
  secondProperty = "text"
}

我也想知道这种初始化的名称是什么

【问题讨论】:

    标签: c# constructor initialization


    【解决方案1】:

    不,绝对没有区别。在这两种情况下,您都在使用对象初始化表达式。对象初始化器是在 C# 3 中引入的。

    在这两种情况下,这完全等同于:

    // tmp is a hidden variable, effectively. You don't get to see it.
    MyClass tmp = new MyClass(); 
    tmp.firstProperty = "text";
    tmp.secondProperty = "text";
    
    // This is your "real" variable
    MyClass calass = tmp;
    

    注意对calass 的分配仅发生在属性被分配之后——正如您对源代码所期望的那样。 (在某些情况下,我相信 C# 编译器可以有效地删除额外的变量并重新排列分配,但它必须可观察地表现得像这种翻译。如果您重新分配现有的变量。)

    编辑:关于省略构造函数参数的细微之处。如果你这样做,它总是等同于包含一个空的参数列表——但这与调用无参数构造函数的 not 相同。例如,可以有可选参数,或者参数数组:

    using System;
    class Test
    {
        int y;
    
        Test(int x = 0)
        {
            Console.WriteLine(x);
        }
    
        static void Main()
        {
            // This is still okay, even though there's no geniune parameterless
            // constructor
            Test t = new Test
            {
                y = 10
            };
        }
    }
    

    【讨论】:

    • 你能告诉我如果我使用初始化表达式,默认构造函数将被调用吗?
    • @Berial:它们都是对象初始化表达式——但是是的,如果你没有为构造函数指定参数列表,就好像你指定了一个空参数列表。跨度>
    【解决方案2】:

    不。事实上,ReSharper 会抱怨带有初始化程序的无参数构造函数的括号是多余的。如果您使用带有一个或多个参数的构造函数,您(显然)仍然需要它们,但由于情况并非如此,只需删除它们即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-31
      • 2011-05-19
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多