如果我有这个对象,它有一个子对象作为自动属性:
public class ParentObject
{
public ChildObject Child { get; set; } = new ChildObject();
}
Child
初始化的点是什么时候?在构建ParentObject
期间,或者就像第一个“{1}}一样。 ChildObject
发生了什么?
我问,因为我正在考虑重新编写一些旧的Net 2代码。旧代码具有明确的支持字段,如:
public class ParentObject
{
private ChildObject child;
public ChildObject Child
{
get { return this.child; }
set { this.child = value; }
}
}
..这意味着Child
在显式设置之前为空。使用具有默认初始化程序的新样式的自动属性会更好(这带来了进一步的好处,因为我们不需要进行检查,例如:
if (parentobject.Child == null) parentobject.Child = new Child();
但如果孩子的财产在父母的建设中被初始化,那么它的“不好”就是这样。 (对于我们在线路上序列化并发送父对象(可能带有空子字段)的情况,(非最佳)。
答案 0 :(得分:3)
属性 - 特别是由编译器创建的基础支持字段 - 在实例化ParentObject
时(在构造函数执行之前)初始化。这与使用初始值设定项的普通字段类似(例如private ChildObject child = new ChildObject();
)。
因此,正如您已正确指出的那样,这不是重构现有代码的正确方法。你应该简单地省略初始化程序:
public class ParentObject
{
public ChildObject Child { get; set; }
}
...导致原始的自动属性语法在C#3.0中引入,我们已经了解并喜欢(在属性初始化程序之类的新内容出现之前)。