2011-07-27 110 views
1

比方說,我有一個父/子關係ob對象,並嘗試創建一個父對象內聯(我不太確定這是正確的詞)。是否可以在創建的代碼中引用創建的父代?如何在內聯對象創建中引用父對象?

Parent = new Parent(
{ 
    Name = "Parent", 
    Child= new Child(/*ReferenceToParent*/) 
}); 

回答

2

圓這個問題的唯一辦法是爲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" } 
}; 

我會盡量避免這種雖然 - 隨着時間的推移它會變得越來越棘手。

+0

謝謝。你能否詳細說明「棘手的部分」?我的印象是垃圾收集器處理這樣的循環對象引用就好了。我可以想象一個序列化的問題,但我不打算在這裏使用。 – Amenti

+1

@Amenti:垃圾收集器很好,但是在你自己的構造函數中「泄漏」對'this'的引用通常是一個壞主意......如果Child構造函數試圖在它的*構造函數的父級調用任何東西,它將在未完全初始化的對象上運行。這可能是微妙的,難以追蹤的錯誤的原因。 –

1

你不能這樣做,因爲還沒有創建父實例。如果孩子在構造函數中需要父實例,則必須創建一個父實例。 首先創建Parent實例,然後將Child傳遞給構造函數,然後將子實例賦予Parent上的屬性。

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

不,因爲參考開始在之後引用分配的對象,構造函數的執行已經完成。