2010-11-17 45 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