微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

显式和非显式C#类初始化程序的区别

参见英文答案 > Initializer syntax                                    2个
>             Nested object initializer syntax                                    1个
这两个类初始值设定项之间产生的差异是什么?在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-keyword创建Class2Instance,并且在运行此代码时将获得NullReferenceException.

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐