何时自动初始化属性?

时间:2016-04-29 16:55:16

标签: c# automatic-properties

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

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();

但如果孩子的财产在父母的建设中被初始化,那么它的“不好”就是这样。 (对于我们在线路上序列化并发送父对象(可能带有空子字段)的情况,(非最佳)。

1 个答案:

答案 0 :(得分:3)

属性 - 特别是由编译器创建的基础支持字段 - 在实例化ParentObject时(在构造函数执行之前)初始化。这与使用初始值设定项的普通字段类似(例如private ChildObject child = new ChildObject();)。

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

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

...导致原始的自动属性语法在C#3.0中引入,我们已经了解并喜欢(在属性初始化程序之类的新内容出现之前)。