不同种类的对象初始化

Ber*_*ial 6 c# constructor initialization

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

MyClass calass = new MyClass()
{
  firstProperty = "text",
  secondProperty = "text"
}
Run Code Online (Sandbox Code Playgroud)

并像这样初始化对象

MyClass calass = new MyClass   // no brackets
{
  firstProperty = "text",
  secondProperty = "text"
}
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*eet 10

不,绝对没有区别.在这两种情况下,您都使用对象初始化表达式.对象初始化器在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;
Run Code Online (Sandbox Code Playgroud)

请注意分配如何calass仅在分配属性发生- 正如您对源代码所期望的那样.(在某些情况下,我认为C#编译器能有效地去除多余的变量,并重新安排任务,但它必须观察地表现这样的翻译.它肯定能有所作为,如果你重新分配现有的变量).

编辑:关于省略构造函数参数的轻微细微之处.如果这样做,它总是等同于包括空参数列表-但是这一样的是相当于调用参数的构造函数.例如,可以有可选参数或参数数组:

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
        };
    }
}
Run Code Online (Sandbox Code Playgroud)