自动 属性 何时初始化?

When is an automatic property initialised?

如果我有这个对象,它有一个子对象作为自动 属性:

public class ParentObject
{
   public ChildObject Child { get; set; } = new ChildObject();
}

Child 是在什么时候初始化的?在构建 ParentObject 期间,还是在 ChildObject 的第一个 'get' 发生时?

我问是因为我正在考虑重新编写一些旧的 Net 2 代码。旧代码有明确的支持字段,如:

public class ParentObject
{
   private ChildObject child;

   public ChildObject Child
   {
     get { return this.child; }
     set { this.child = value; }
   }
}

..这意味着 Child 在明确设置之前为空。将新样式的 auto-属性 与默认初始化程序一起使用会很好(这带来了更多好处,因为我们不需要进行检查,例如:

if (parentobject.Child == null) parentobject.Child = new Child();

但是如果子 属性 是在构建父对象时初始化的,那么对于我们序列化并发送父对象(可能有一个空子对象)的情况来说,它是 'bad'(不是最优的)场)通过电线。

属性——具体来说,是由编译器创建的底层支持字段——在实例化 ParentObject 时(就在执行构造函数之前)初始化。这类似于带有初始值设定项的普通字段(例如 private ChildObject child = new ChildObject();)。

因此,正如您正确指出的那样,这不是重构现有代码的正确方法。您应该简单地省略初始化程序:

public class ParentObject
{
    public ChildObject Child { get; set; }
}

... 导致我们在 C# 3.0 中引入的原始自动 属性 语法,我们已经了解并喜爱它(在 属性 初始化器等新东西出现之前)。