2011-09-30 114 views
5

我有一個用戶類。其中一個屬性需要是「關聯」用戶,因此它的類型需要爲User。現在,當我初始化這個類時,當它嘗試初始化Associated屬性時,會發生堆棧溢出。當前代碼:在自己的構造函數中初始化一個新類

public class User { 
    public User() { 
     this.Associated = new User(); 
    } 

    public User Associated { get; set; } 
} 

這是可行的還是我在吠叫錯誤的樹?

+1

爲什麼不能爲您的關聯用戶的有效默認值? – user957902

+0

即使對於未關聯的用戶,在我所需的關聯User類中還有其他默認值。 –

回答

4

你可以使用延遲加載的方法爲您彙總User類,並在構造函數中未初始化:

public class User { 
    private User _user; 

    public User Associated 
    { 
     get 
     { 
      if (_user == null) 
       _user = new User(); 
      return _user; 
     } 
    } 
} 
+0

接受爲我提供我需要的解決方法。謝謝。 –

1

不要在構造函數中初始化Associated成員。如果您只是在需要時初始化它,我認爲堆棧溢出應該消失。

2

您正在遞歸調用User構造函數。每當您無限期地(或更確切地說,廣告StackOverflowExceptionnew一個User,它new的另一個User

1

問題是,你已經開發了一個無限循環的新用戶。每個新用戶都會獲得一位新用戶作爲員工。

我會從默認的構造函數中刪除該分配,然後將其作爲公共屬性添加。這樣做可以讓您控制何時分配聯繫人,並防止無限循環。

8

User.Associated是否必須在施工時填充?如果你從構造函數中刪除了這個賦值,你就不應該得到它。

你得到一個SO的原因是因爲當你構建一個User()時,它構造了一個User(),這反過來構成了一個User(),它一直是烏龜。

+1

對於一個好的答案和海龜比喻+1! –

1

調用構造內部構造帶你到一個無限循環:

創建新的User實例 - >創建新的User實例 - >創建新的User實例 - >創建新的User實例 - >創建新的User實例 - >創建新的User實例...

你可以做這樣的事情:

public class User { 
    public User() { 

    } 

    public AddAssociatedUser() { 
     this.Associated = new User(); 
    } 

    public User Associated { get; set; } 
} 

,並調用AddAssociatedUser當你需要它。