【问题标题】:When is an automatic property initialised?什么时候初始化自动属性?
【发布时间】:2016-04-30 01:07:24
【问题描述】:

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

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 在明确设置之前为空。将新样式的自动属性与默认初始化程序一起使用会很好(这会带来更多好处,因为我们不需要进行检查,例如:

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

但是,如果子属性是在构造父对象时初始化的,那么对于我们通过网络序列化和发送父对象(可能带有空子字段)的情况,它是“不好的”(不是最佳的)。

【问题讨论】:

  • 当您的意思是初始化时,您使用的是实例化这个词。属性未实例化。您没有属性实例。
  • 嗯?您正在重构 从不 显式初始化特定属性的代码。当然任何使用初始化意味着你在做一些不同的事情,所以它并不是真正的重构。
  • 看来简单的public ChildObject Child { get; set; } 将是最接近原始的重构。
  • 我知道重构引入了新的行为,但问题仍然存在 - 什么时候执行初始化。我也意识到(现在我想起来了)序列化程序可能会命中属性,因此无论如何都会初始化支持字段。不过,感谢您的帮助:)

标签: c# automatic-properties


【解决方案1】:

ParentObject 被实例化时(就在构造函数被执行之前),该属性——特别是编译器创建的底层支持字段——被初始化。这与带有初始化程序的普通字段类似(例如private ChildObject child = new ChildObject();)。

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

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

... 导致我们早在 C# 3.0 中就引入的原始自动属性语法(在属性初始化程序等新东西出现之前)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2016-12-10
    • 2012-03-10
    相关资源
    最近更新 更多