2011-07-27 4 views

답변

2

유일한 방법은 될 것입니다.

public class Parent 
{ 
    public Child Child { get; private set; } 
    public string Name { get; set; } 

    public Parent() 
    { 
     Child = new Child(this); 
    } 
} 

public class Child 
{ 
    private readonly Parent parent; 
    public string Name { get; set; } 

    public Child(Parent parent) 
    { 
     this.parent = parent; 
    } 
} 

다음 :

Parent parent = new Parent 
{ 
    Name = "Parent name", 
    // Sets the Name property on the existing Child 
    Child = { Name = "Child name" } 
}; 

내가 이 종류를 피하기 위해을 시도 할 다음 아이의 다른 속성을 설정할 수 있습니다 (제가 당신이하려는 가정입니다) 개체 이니셜 라이저 관계의 - 그것은 시간이 지남에 따라 점점 까다로워 질 수 있습니다.

+0

감사합니다. "까다로운 부분"에 대해 자세히 설명해 주시겠습니까? 가비지 컬렉터가 이러한 순환 객체 참조를 잘 처리한다는 인상하에있었습니다. 직렬화에 문제가 있다고 상상할 수도 있지만 여기서는 사용하지 않을 계획입니다. – Amenti

+1

@Amenti : 가비지 컬렉터는 괜찮지 만 자신의 생성자 내에서 'this'에 대한 참조를 누설하는 것은 일반적으로 나쁜 생각입니다. 'Child'생성자가 해당 생성자 내에서 부모에 대한 호출을 시도하면, 완벽하게 초기화되지 않은 객체에서 작동합니다. 그 미묘한, 추적하기 어려운 버그의 원인이 될 수 있습니다. –

1

부모 인스턴스가 아직 만들어지지 않았기 때문에이 작업을 수행 할 수 없습니다. 자식이 생성자에 Parent의 인스턴스를 필요로하는 경우 하나를 만들어야합니다. 부모의 인스턴스를 먼저 만든 다음 부모가 생성자에 전달한 다음 하위 인스턴스를 부모의 속성에 할당합니다. Parent 생성자가 Child 생성자 자체를 호출하고 this를 전달하는 이번 라운드

var parent = new Parent 
{ 
    Name = "Parent", 
    //More here... 
}; 
var child = new Child(parent); 
parent.Child = child; 
1

아니요, 참조가 할당 된 개체 을 참조하기 시작하므로 후에 생성자의 실행이 완료되었습니다.

관련 문제