This question already has answers here:
Initializer syntax

(2 个回答)



Nested object initializer syntax

(1 个回答)


5年前关闭。




这两个类初始值设定项之间产生的差异是什么?两者在 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,
    },
};

最佳答案

你给出的两个例子并不完全相同。使用 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();
  }
}

关于c# - 显式和非显式 C# 类初始值设定项的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35957855/

10-13 07:02