注文

2017-01-27 3 views
2

をネストされたオブジェクトを使用しているとき、私は、オブジェクト初期化子を使用してRootのインスタンスを作成し、次のコードを持っている:注文

var r = new Root { Person = new Person { Age = 20, Name = "Hans" } }; 

Is there any benefit of using an Object Initializer?からwe'd場合、私が知っているだけで、内のオブジェクトを持っていますPersonこれは、このような何かに翻訳されました:

var p = new Person(); 
p.Age = 20; 
p.Name = 20; 

私は何をどのようにこれが私の最初の例では、ネストされたオブジェクトには影響しないさだろうか? Person完全に作成され、Rootの新しいインスタンスに割り当てるか、またはこの単にこのような何かに翻訳されているよりもです:

var r = new Root(); 
r.Person = new Person(); 
r.Person.Age = 20;   // this would call the Persons getter 
r.Person.Name = "Hans";  // this would call the Persons getter 

私が尋ねる理由は、与えられたRootためPersonを変更するためのゲッターとセッターがかなりあるということです複雑で、私はそれのプロパティを設定するためにそのゲッターを呼ぶのを避けるのが好きですPerson

答えて

2

これは、C#言語仕様の7.6.10.2に明示的に記載されています。

public class Point 
{ 
    int x, y; 
    public int X { get { return x; } set { x = value; } } 
    public int Y { get { return y; } set { y = value; } } 
} 

public class Rectangle 
{ 
    Point p1, p2; 
    public Point P1 { get { return p1; } set { p1 = value; } } 
    public Point P2 { get { return p2; } set { p2 = value; } } 
} 

Rectangle r = new Rectangle 
{ 
    P1 = new Point { X = 0, Y = 1 }, 
    P2 = new Point { X = 2, Y = 3 } 
}; 

標準として、これが同じ効果を持っていることを述べている:

標準は、「ネストされたオブジェクト初期化子」のため、この例を示しますあなたが見ることができる。ここ

Rectangle __r = new Rectangle(); 
Point __p1 = new Point(); 
__p1.X = 0; 
__p1.Y = 1; 
__r.P1 = __p1; 
Point __p2 = new Point(); 
__p2.X = 2; 
__p2.Y = 3; 
__r.P2 = __p2; 
Rectangle r = __r; 

ことRectangle.P1Rectangle.P2プロパティは既に作成されたPointオブジェクトから初期化されます。

これは、ルートの新しいインスタンスに割り当てられているよりも、あなたの質問

への答えは人が完全に作成されていることを証明しますか?

は間違いなく:はい。

1

ゲッターの中にブレークポイントをPersonRootクラスに設定することで、これを簡単に確認できます。デバッグするときに、決してヒットしないことがわかります。

これは実際に作成されている次のオブジェクトグラフにつながる:

var p = new Person(); 
p.Age = 20; 
p.Name = "Hans"; 

var r = new Root(); 
r.Person = p; 

あなたはどのRootも存在する前にPersonは、最初が作成されるため、何もゲッターが人物のプロパティを設定するためにアクセスされていない参照します。

これにより、Personが完全に作成された場合にのみ、Rootが完全に作成されます。