显式和非显式 C# class 初始化器的区别
Difference in explicit and non-explicit C# class initializers
这两个 class 初始值设定项之间的区别是什么?两者在 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;
如您所见,在第二个示例中,缺少使用 new
关键字创建 Class2Instance
,当 运行 这段代码。
但是,当您在 Class1
:
的构造函数中创建新的 Class2Instance
时,可以防止在第二个示例中获得 NullReferenceException
class Class1
{
public Class1()
{
Class2Instance = new Class2();
}
}
这两个 class 初始值设定项之间的区别是什么?两者在 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;
如您所见,在第二个示例中,缺少使用 new
关键字创建 Class2Instance
,当 运行 这段代码。
但是,当您在 Class1
:
Class2Instance
时,可以防止在第二个示例中获得 NullReferenceException
class Class1
{
public Class1()
{
Class2Instance = new Class2();
}
}