Почему набор свойств генерирует исключение StackOverflow?

Я знаю Java и обычно помещал бы в методы получения / установки. Я заинтересован в том, чтобы сделать это на C # со следующим кодом, но он вызывает исключение StackOverflow. Что я делаю неправильно?

Телефонный код

c.firstName = "a";

Код недвижимости

public String firstName;
{
    get
    {
        return firstName;
    }
    set
    {
        firstName = value;
    }
}
51 c#
15.12.2008 00:09:57
2 ОТВЕТА
РЕШЕНИЕ

Это потому, что вы рекурсивно вызываете свойство - в нем setвы снова устанавливаете свойство, которое продолжается до бесконечности, пока вы не уничтожите стек.

Вам нужно личное поле для хранения значения, например

private string firstName;

public string FirstName
{
    get
    {
        return this.firstName;
    }
    set
    {
        this.firstName = value;
    }
}

В качестве альтернативы, если вы используете C # 3.0, вы можете использовать авто-свойство, которое создает для вас скрытое поле поддержки, например

public string FirstName { get; set; }
108
11.08.2012 23:03:35
Не знал как позвонить hidden backing field. Спасибо за авто-собственность.
broadband 22.08.2016 12:38:47
Я не могу поверить, что это решение ... моя вера в C # почти исчезла.
Daniel 7.11.2018 20:24:14
Ну и дела, если ты думаешь, что это плохо, я бы не хотел видеть, как ты пишешь Java.
Lucas Leblanc 24.05.2019 20:48:13
Не могли бы вы объяснить, как это взорвать стек? Разве это не то же самое значение, блуждающее в сеттере?
Arli Chokoev 25.02.2020 09:51:00

Вы устанавливаете имя свойства внутри своей собственности, а не имя поля. Это будет работать лучше:

private string m_firstName;

public String firstName;
{
    get
    {
        return m_firstName;
    }
    set
    {
        m_firstName = value;
    }
}
14
23.04.2018 06:54:05