自动 属性 何时初始化?
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 中引入的原始自动 属性 语法,我们已经了解并喜爱它(在 属性 初始化器等新东西出现之前)。
如果我有这个对象,它有一个子对象作为自动 属性:
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 中引入的原始自动 属性 语法,我们已经了解并喜爱它(在 属性 初始化器等新东西出现之前)。