Stackoverflow Исключение вызвано свойством - PullRequest
1 голос
/ 17 ноября 2010

У меня есть класс User, у которого есть свойство Creator типа User (пользователь, создавший этого пользователя)

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 в строке UserName = ""; Я предполагаю, что это из-за того, что свойство Creator застревает в большом цикле. Почему это происходит, если я не установил Creator для нового пользователя? Есть ли способ, которым я могу остановить это?

Ответы [ 3 ]

3 голосов
/ 17 ноября 2010

Ставлю деньги, ваш UserName сеттер выглядит так

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

Это вызывает бесконечную рекурсию. Вам нужно либо спроектировать его как свойство Creator, которое вы имели, либо сделать это

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

EDIT:

Я сомневаюсь, что свойство Creator имеет какое-либо отношение к проблеме, потому что это значение будет просто нулем в конструкторе

2 голосов
/ 17 ноября 2010

Полагаю, вы каким-то образом инициализируете Creator, что приводит к созданию бесконечного числа пользователей, что приводит к исключению 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.}

На самом деле, я понятия не имею, как это исправить, потому что его код слишком сложно угадать, смеется.

1 голос
/ 17 ноября 2010

У меня есть пользователь, где создатель сам.Я думаю, это была проблема с данными, а не проблема кода.В любом случае, спасибо за просмотр.

...