Перегрузка геттера и сеттера вызывает StackOverflow в C # - PullRequest
5 голосов
/ 17 сентября 2009

Я не уверен, что вызывает исключение StackOverflowException при попытке перезаписать функцию get и set. Когда я просто использую get по умолчанию, он работает.

enum MyEnumType
{
....
}

public MyEnumType data { get; set; }

Но когда я пытаюсь добавить дополнительные данные, возникает исключение StackOverflowException

public MyEnumType data 
{
  get
  {
    return data;
  }
  set 
  {
    data = value;
  }
}

Есть идеи? Когда я делаю это для атрибутов управления пользователями asp .net, это не проблема. Мне интересно, почему это вызывает исключение StackOverflowException для обычного типа данных enum.

Ответы [ 4 ]

28 голосов
/ 17 сентября 2009

Да, у вас нет вспомогательного поля ... вот как вы должны это сделать:

 private MyEnumType data;

public MyEnumType Data 
{
  get
  {
    return data;
  }
  set 
  {
    data = value;
  }
}

В результате вы обращаетесь к свойству, которое возвращает его, что вызывает бесконечный цикл попыток доступа к его собственному значению. Следовательно, StackOverFlow.

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

public MyEnumType Data 
{
  get;
  set;
}
6 голосов
/ 17 сентября 2009

Вы ссылаетесь на само свойство внутри вашего метода получения и установки, которое вызывает бесконечную рекурсию ( переполнение стека ). Это было бы более очевидно, если бы вы использовали стандартные соглашения об именах (Data).
Попробуйте что-то вроде:

private MyEnumType _data;

public MyEnumType Data 
{
  get { return _data; }
  set { _data = value; }
}
3 голосов
/ 17 сентября 2009
public class MyClass
{
    string propertyString;

    public string MyPropertyString
    {
        get
        {
            return propertyString;
        }
        set
        {
            propertyString = value;
        }
    }
}

Имя свойства должно отличаться от имени участника.

0 голосов
/ 17 сентября 2009

Поместите точку останова в установщик / получатель и отладьте, убедившись, что вы используете шаг в (F11), а не шаг - это должно помочь объяснить, что происходит.

...