此 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; }
}

这是 C# 规范中的对象初始值设定项语法允许的,其中称为嵌套对象初始值设定项。它相当于:

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

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

此语法的好处是,调用方可以使用方便的对象初始值设定项语法,即使属性是仅限 getter 的,也可以对嵌套对象设置可变属性。例如,如果 Class1Prop 是仅限 getter 的属性,则该示例仍然有效。

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

相关内容

最新更新