2016-04-29 10 views
2

は:どの時点で自動プロパティはいつ初期化されますか?私は自動プロパティとして子オブジェクトを持つこのオブジェクト、持っている場合

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

Childが初期化されますか? ParentObjectの建設中に、またはちょうどChildObjectの最初の「取得」が発生するのと同じですか?

私はいくつかの古いネット2コードを修正することを検討しているので、私は尋ねます。明示的に設定されるまでChildがnullであることを意味..which

public class ParentObject 
{ 
    private ChildObject child; 

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

:古いコードは次のように明示的なバッキングフィールドがあります。それで、さらに利益をもたらしている私たちのようなチェックを行う必要はありません(デフォルト初期化子で自動プロパティの新しいスタイルを使用するとよいでしょう:

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

をしかし、子プロパティは、建設に初期化されている場合

+0

初期化を意味するときに、インスタンス化という単語を使用しています。プロパティはインスタンス化されません。プロパティのインスタンスはありません。 – Servy

+2

Eh?特定のプロパティを明示的に初期化しないコードをリファクタリングしています。確かに*初期化の使用はあなたが何か違うことをしていることを意味しているので、実際にはリファクタリングではありません。 –

+1

それは単に 'public ChildObject Child {get;セット; }は、元のリファクタリングに最も近いものになります。 – David

答えて

3

プロパティ(具体的には、基になるバッキングフィールド)は、 (コンストラクタが実行される直前)ParentObjectが初期化されます。これは、イニシャライザを持つ通常のフィールドと同様に機能します(例:private ChildObject child = new ChildObject();)。

あなたが正しく記したように、それはあなたの既存のコードをリファクタリングする正しい方法ではありません。あなたは、単に初期化子省くべきだ:オリジナルの自動プロパティの構文は帰りC#3.0での私たちが知っていると愛に来ているが導入結果...

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

を(プロパティの初期化子のような新しいものが入って来た前) 。

関連する問題