显式和非显式C#类初始值设定项的差异

时间:2016-03-12 12:52:36

标签: c# class initialization initializer

这两个类初始值设定项之间产生的差异是什么?在C#中,两者似乎都是语法正确的。第二个是第一个的快捷方式吗?

Class1 class1 = new Class1()
{
    Boolean1 = true,
    Class2Instance = new Class2
    {
        Boolean2 = true,
    },
};

Class1 class1 = new Class1()
{
    Boolean1 = true,
    Class2Instance =
    {
        Boolean2 = true,
    },
};

我问,因为显然这样做无效:

Class1 class1 =
{
    Boolean1 = true,
    Class2Instance = new Class2()
    {
        Boolean2 = true,
    },
};

1 个答案:

答案 0 :(得分:1)

你给出的两个例子并不完全相同。使用像ILSpy这样的工具,您可以检查编译器为这两个语句创建的内容。

第一个编译成以下内容(使用ILSpy反编译):

Class1 expr_06 = new Class1();
expr_06.Boolean1 = true;
expr_06.Class2Instance = new Class2
{
    Boolean2 = true
};

而第二个例子编译成以下内容(使用ILSpy反编译):

Class1 expr_06 = new Class1();
expr_06.Boolean1 = true;
expr_06.Class2Instance.Boolean2 = true;

正如您所看到的,在第二个示例中,缺少使用Class2Instance - 关键字创建new,并且在运行此代码时您将获得NullReferenceException

但是,当您在NullReferenceException的构造函数中创建新的Class2Instance时,您可以阻止在第二个示例中获得Class1

class Class1
{
  public Class1()
  {
    Class2Instance = new Class2();
  }
}