此C#对象初始化程序代码发生了什么?

时间:2018-10-24 20:02:28

标签: c#

此C#代码怎么了?我什至不知道为什么会编译。具体来说,在设置Class1Prop尝试使用对象初始化程序语法的地方发生了什么?语法无效,但在运行时会编译并产生空引用错误。

void Main()
{    
    var foo = new Class1
    {
        Class1Prop = 
        {
            Class2Prop = "one"
        }
    };
}

public class Class1
{
    public Class2 Class1Prop { get; set; }
}

public class Class2
{
    public string Class2Prop { get; set; }
}

1 个答案:

答案 0 :(得分:13)

在C#规范中,object initializer syntax允许将其称为嵌套对象初始化程序。等效于:

var _foo = new Class1();
_foo.Class1Prop.Class2Prop = "one"
var foo = _foo;

为什么这会引发空引用异常应该更明显。 Class1Prop从未在Class1的构造函数中初始化。

此语法的好处是,即使属性仅是吸气剂,也可以在嵌套对象上设置可变属性,即使调用者可以使用便捷的对象初始化程序语法。例如,如果Class1Prop是仅吸气剂的属性,则该示例仍然有效。

请注意,创建了一个不可访问的临时变量,以防止在运行完全初始化之前访问字段或数组插槽。