【发布时间】: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; }将是最接近原始的重构。 -
我知道重构引入了新的行为,但问题仍然存在 - 什么时候执行初始化。我也意识到(现在我想起来了)序列化程序可能会命中属性,因此无论如何都会初始化支持字段。不过,感谢您的帮助:)