2017-01-27 2 views
2

를 사용하여 나는 객체 초기화 사용 Root의 인스턴스를 생성하는 다음과 같은 코드가 있습니다 we'd 경우 내가 아는 Is there any benefit of using an Object Initializer?에서주문 중첩 된 객체

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

는 내부 개체가 Person이이 같은 번역되었습니다

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

내가 어떻게 내 첫 번째 예에서 중첩 된 객체에 영향을 미치지 않습니다 궁금해? Root의 새로운 인스턴스에 할당하거나 단지 이런 식으로 번역되는 것보다 Person 완전히 생성된다

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 

물어 이유는 getter와 setter가 주어진 Root에 대한 Person 매우이다 수정하는 것입니다 복잡하고 나는 Person에 대한 속성을 설정하기 위해 getter를 호출하지 않는 것이 좋습니다.

답변

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

-class 내에 Person에 대한 getter 내의 중단 점을 설정하여 쉽게 확인할 수 있습니다. 디버깅 할 때 절대 적중하지 않습니다. 이것은 실제로 다음과 같은 오브젝트 그래프로 연결

가 생성되는 :

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

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

당신은 Person처음을 만들어지기 때문에 어떤 Root도 존재하기 전에 더 게터이는 사람의 속성을 설정하기 위해 액세스되지 않은 참조 .

이렇게하면 이전에 Person이 완전히 생성 된 경우에만 Root이 완전히 생성됩니다.