부모/자식 관계 ob 객체가 있고 인라인으로 부모 객체를 만들려고한다고 가정 해 봅시다 (올바른 단어라고는 잘 모르겠습니다). 생성 된 부모를 자체 작성 코드에서 참조 할 수 있습니까?개체의 인라인 만들기에서 부모를 참조하는 방법은 무엇입니까?
Parent = new Parent(
{
Name = "Parent",
Child= new Child(/*ReferenceToParent*/)
});
부모/자식 관계 ob 객체가 있고 인라인으로 부모 객체를 만들려고한다고 가정 해 봅시다 (올바른 단어라고는 잘 모르겠습니다). 생성 된 부모를 자체 작성 코드에서 참조 할 수 있습니까?개체의 인라인 만들기에서 부모를 참조하는 방법은 무엇입니까?
Parent = new Parent(
{
Name = "Parent",
Child= new Child(/*ReferenceToParent*/)
});
유일한 방법은 될 것입니다.
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" }
};
내가 이 종류를 피하기 위해을 시도 할 다음 아이의 다른 속성을 설정할 수 있습니다 (제가 당신이하려는 가정입니다) 개체 이니셜 라이저 관계의 - 그것은 시간이 지남에 따라 점점 까다로워 질 수 있습니다.
부모 인스턴스가 아직 만들어지지 않았기 때문에이 작업을 수행 할 수 없습니다. 자식이 생성자에 Parent의 인스턴스를 필요로하는 경우 하나를 만들어야합니다. 부모의 인스턴스를 먼저 만든 다음 부모가 생성자에 전달한 다음 하위 인스턴스를 부모의 속성에 할당합니다. Parent
생성자가 Child
생성자 자체를 호출하고 this
를 전달하는 이번 라운드
var parent = new Parent
{
Name = "Parent",
//More here...
};
var child = new Child(parent);
parent.Child = child;
아니요, 참조가 할당 된 개체 을 참조하기 시작하므로 후에 생성자의 실행이 완료되었습니다.
감사합니다. "까다로운 부분"에 대해 자세히 설명해 주시겠습니까? 가비지 컬렉터가 이러한 순환 객체 참조를 잘 처리한다는 인상하에있었습니다. 직렬화에 문제가 있다고 상상할 수도 있지만 여기서는 사용하지 않을 계획입니다. – Amenti
@Amenti : 가비지 컬렉터는 괜찮지 만 자신의 생성자 내에서 'this'에 대한 참조를 누설하는 것은 일반적으로 나쁜 생각입니다. 'Child'생성자가 해당 생성자 내에서 부모에 대한 호출을 시도하면, 완벽하게 초기화되지 않은 객체에서 작동합니다. 그 미묘한, 추적하기 어려운 버그의 원인이 될 수 있습니다. –