Инициализация нового класса в своем собственном конструкторе - PullRequest
5 голосов
/ 30 сентября 2011

У меня есть класс пользователя.Одно из свойств должно быть «связанным» пользователем, поэтому его тип должен быть User.Прямо сейчас, когда я инициализирую класс, я получаю переполнение стека, когда он пытается инициализировать свойство Associated.Текущий код:

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

    public User Associated { get; set; }
}

Это выполнимо или я лаю не то дерево?

Ответы [ 6 ]

8 голосов
/ 30 сентября 2011

Нужно ли заполнять User.Associated на строительстве?Если вы удалите присваивание из конструктора, вы не получите SO.

Причина, по которой вы получаете SO, заключается в том, что когда вы создаете User(), он создает User(), что, в свою очередь, создает User() и это черепахи все время вниз.

4 голосов
/ 30 сентября 2011

Вы можете использовать ленивый загруженный метод для вашего агрегированного User класса и не инициализировать его в конструкторе:

public class User {
    private User _user;

    public User Associated 
    { 
        get
        {
            if (_user == null)
                _user = new User();
            return _user;
        }
    }
}
2 голосов
/ 30 сентября 2011

Вы вызываете конструктор User рекурсивно. Каждый раз, когда вы new a User, это new s другое User до бесконечности (точнее, объявление StackOverflowException).

1 голос
/ 30 сентября 2011

Вызов конструктора внутри конструктора приводит вас к бесконечному циклу:

Создать новый User экземпляр -> Создать новый User экземпляр -> Создать новый User экземпляр -> Создать новый User экземпляр -> Создать новый User экземпляр -> Создать новый User экземпляр ...

Вы могли бы сделать что-то подобное:

public class User {
    public User() {

    }

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

    public User Associated { get; set; }
}

И позвоните по номеру AddAssociatedUser, когда вам это нужно.

1 голос
/ 30 сентября 2011

Проблема в том, что вы разработали бесконечный цикл новых пользователей. Каждый новый пользователь получает нового пользователя в качестве ассоциированного.

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

1 голос
/ 30 сентября 2011

Не инициализируйте Ассоциированный член в конструкторе.Если вы инициализируете его только тогда, когда вам это нужно, я думаю, что переполнение стека должно исчезнуть.

...