2010-11-17 29 views
1

我有有一個屬性叫做造物主它的類型是用戶(誰創造了這個用戶的用戶)#1例外地產

public class User { 

    public User() 
    { 
     UserName = ""; 
     EmailAddress = ""; 
    } 

    public String UserName { get; set; } 
    public String EmailAddress { get; set; } 
    //bunch of other properties 

    public User Creator { get; set; } 
} 

我正在上線用戶名出現StackOverflow異常的用戶類= 「」。我認爲這是因爲創作者的財產陷入了一個大循環。如果我沒有將Creator設置爲新用戶,爲什麼會發生這種情況?有沒有辦法阻止這種情況的發生?

+11

'UserName'和'EmailAddress'屬性是什麼樣的? – thecoop 2010-11-17 16:03:12

+3

您需要發佈代碼1)編譯2)重現錯誤 – 2010-11-17 16:06:26

+0

請檢查您是如何實現UserName或由UserName引用的任何屬性的。如果可能的話,請在這裏發佈代碼。 – 2010-11-17 16:07:34

回答

2

我的猜測是你正在初始化造物主某種方式導致無數的用戶被創建導致StackoverflowException。

這裏的產生只是一個例子:

public List<User> CreatUsers() 
{ 
    List<User> users = new List<User>; 

    //Some DB call to get a list of users 
    foreach (var record in userlist) 
     List.Add(CreatUser(record)); 
} 

public User CreateUser(?? record) 
{ 
    User user = new User(); 
    //Set properties 
    if (record has creator) //pseudo-code 
     user.Creator = CreatUser(record.Creator); //guessing as to record.Creator 
} 

public class User 
{ 
    public User() 
    { 
     UserName = "";   //Stackoverflow on this line. 
     EmailAddress = ""; 
    } 

    public String UserName { get; set; } 
    public String EmailAddress { get; set; } 

    public User Creator { get; set; } 
} 
//{Cannot evaluate expression because the current thread is in a stack overflow state.} 

其實,我不知道如何解決它,因爲它太難了,在他的所有代碼猜測,哈哈。

+0

+1我認爲這很可能是OP問題 – digEmAll 2010-11-17 16:32:30

+0

好吧,顯然他回答了他自己的問題,指出在創建作爲自己創作者的用戶時他正在做一些循環。起初我無法想到爲什麼這會是一個問題,因爲'user.Creator = user;'應該不是問題,但現在我可以看到他創建另一個_SAME_用戶的實例,將其設置爲創建者,他一遍又一遍地做,而不是使用同一個用戶對象。所以他的問題是在他沒有發佈的代碼中。大聲笑。 – 2010-11-17 16:40:05

+0

哦,我的猜測是正確的,除了我猜他的'Creator = new User()'不在構造函數內,而是在他的數據循環中創建用戶。我要更新我的帖子,以顯示他是如何做到的以及他應該如何解決這個問題。 – 2010-11-17 16:42:46

3

我可以打賭,你的錢二傳UserName像這樣

public string UserName 
{ 
    get { return UserName; } 
    set { UserName = value; } 
} 

這是造成infinate遞歸。您需要可以設計它就像你有Creator財產,或爲此

private string _UserName; 
public string UserName 
{ 
    get { return _UserName; } 
    set { _UserName = value; } 
} 

編輯:

我懷疑Creator酒店有什麼這個問題做的,因爲這個值也只是在空構造函數

+0

已經嘗試過並且它不起作用 – 2010-11-17 16:11:26

+0

這會引入SO異常。但是在屬性setter中,而不是在構造函數中的UserName =「」,如問題中所述。 – Marijn 2010-11-17 16:16:22

1

我有一個用戶創建者本身。我想這是一個數據問題,而不是代碼問題。無論如何感謝你看這個。

+1

我仍然會說這是一個代碼問題。代碼應該是防禦性的,並且優雅地處理這樣的數據問題。 – 2010-11-17 16:27:22

+0

我不明白爲什麼會導致一個Stackoverflow雖然。我可以做到以下沒有問題。 'User user = new User(); user.Creator = user;' – 2010-11-17 16:27:29

+0

@Richard我同意。我添加了一些額外的檢查,以便在這種情況下遞歸停止。 – 2010-11-17 16:30:07