比方說,我有一個父/子關係ob對象,並嘗試創建一個父對象內聯(我不太確定這是正確的詞)。是否可以在創建的代碼中引用創建的父代?如何在內聯對象創建中引用父對象?
Parent = new Parent(
{
Name = "Parent",
Child= new Child(/*ReferenceToParent*/)
});
比方說,我有一個父/子關係ob對象,並嘗試創建一個父對象內聯(我不太確定這是正確的詞)。是否可以在創建的代碼中引用創建的父代?如何在內聯對象創建中引用父對象?
Parent = new Parent(
{
Name = "Parent",
Child= new Child(/*ReferenceToParent*/)
});
圓這個問題的唯一辦法是爲Parent
構造函數調用構造函數Child
本身並傳遞this
。你的對象初始化(這是我假設你正在試圖做的),那麼可以設置對孩子的其他屬性:
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實例,然後將Child傳遞給構造函數,然後將子實例賦予Parent上的屬性。
var parent = new Parent
{
Name = "Parent",
//More here...
};
var child = new Child(parent);
parent.Child = child;
不,因爲參考開始在之後引用分配的對象,構造函數的執行已經完成。
謝謝。你能否詳細說明「棘手的部分」?我的印象是垃圾收集器處理這樣的循環對象引用就好了。我可以想象一個序列化的問題,但我不打算在這裏使用。 – Amenti
@Amenti:垃圾收集器很好,但是在你自己的構造函數中「泄漏」對'this'的引用通常是一個壞主意......如果Child構造函數試圖在它的*構造函數的父級調用任何東西,它將在未完全初始化的對象上運行。這可能是微妙的,難以追蹤的錯誤的原因。 –