2016-04-29 2 views
2

Если у меня есть этот объект, который имеет дочерний объект в качестве автоматического имущества:Когда автоматическое свойство инициализировано?

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

В какой момент является Child инициализируется? Во время строительства ParentObject, или так же, как происходит первый «get» от ChildObject?

Прошу, потому что я рассматриваю возможность переработать старый код Net 2. Старый код имеет явные поля аккомпанемента, как:

public class ParentObject 
{ 
    private ChildObject child; 

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

..which означает, что Child равно нулю, пока явно не установлено. Было бы хорошо, чтобы использовать новый стиль авто-свойства с по умолчанию Инициализатором (который приносит дополнительные преимущества в том, что нам не нужно делать проверки, такие как:

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

Но если имущество ребенка инициализируется на строительство из родителя, то это «плохо» (не оптимально) для случаев, когда мы сериализуем и отправляем родительский объект (потенциально с пустым дочерним полем) по проводу.

+0

Вы используете слово, созданное при инициализации. Свойства не создаются. У вас нет экземпляров свойств. – Servy

+2

Э? Вы рефакторинг кода, который * никогда * явно не инициализирует определенное свойство. Конечно * любое * использование инициализации означает, что вы делаете что-то другое, так что это не рефакторинг. –

+1

Кажется, что просто 'public ChildObject Child {get; задавать; } 'будет самым близким рефакторингом к оригиналу. – David

ответ

3

Имущество - в частности, базовое поле поддержки, созданный компилятором, инициализируется при создании экземпляра ParentObject (непосредственно перед выполнением конструктора). Это работает аналогично нормальным полям с инициализаторами (например, private ChildObject child = new ChildObject();).

Таким образом, как вы правильно отметили, это неправильный способ реорганизации существующего кода. Вы должны просто уйти из инициализатора:

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

... в результате оригинальный синтаксис авто-свойство введен еще в C# 3.0, что мы приехали знать и любовь (прежде чем новый материал как инициализаторах собственности пришел) ,