C#类初始化器中显式和隐式的区别

4
这两种类初始化器有什么不同?在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,
    },
};

Class2Instance 是 Class2 类型的实例。 - Itzalive
1个回答

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;

如您所见,在第二个示例中,使用 new 关键字创建 Class2Instance 的步骤被省略了,运行此代码时会出现 NullReferenceException
但是,当您在 Class1 的构造函数中创建一个新的 Class2Instance 时,可以防止在第二个示例中出现 NullReferenceException
class Class1
{
  public Class1()
  {
    Class2Instance = new Class2();
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接