Перегрузка геттера и сеттера вызывает StackOverflow в C #
-
08-07-2019 - |
Вопрос
Я не уверен, что вызывает исключение 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.
Решение
Да, у вас нет вспомогательного поля ... вот как вы должны это сделать:
private MyEnumType data;
public MyEnumType Data
{
get
{
return data;
}
set
{
data = value;
}
}
То, что происходит, это то, что вы ссылаетесь на свойство для возврата самого себя, это вызывает бесконечный цикл попыток доступа к его собственному значению. Следовательно, StackOverFlow.
В вашем случае, когда вы не добавляете никакой дополнительной логики в методы get и set, вы также можете использовать автоматическое свойство. Это просто определяется так:
public MyEnumType Data
{
get;
set;
}
Другие советы
Вы ссылаетесь на само свойство внутри вашего метода получения и установки, что вызывает бесконечную рекурсию ( переполнение стека ). Это было бы более очевидно, если бы вы использовали стандартные соглашения об именах (Data).
Попробуйте что-то вроде:
private MyEnumType _data;
public MyEnumType Data
{
get { return _data; }
set { _data = value; }
}
public class MyClass
{
string propertyString;
public string MyPropertyString
{
get
{
return propertyString;
}
set
{
propertyString = value;
}
}
}
Имя свойства должно отличаться от имени члена.
Поместите точку останова в установщик / получатель и отладьте ее, убедившись, что вы используете шаг в (F11), а не шаг - это должно помочь объяснить, что происходит.