为什么这个简单的代码会导致堆栈溢出异常?
本文关键字:堆栈 栈溢出 异常 简单 代码 为什么 | 更新日期: 2023-09-27 18:05:41
在设置方法中抛出堆栈溢出异常:
public string TimeZone
{
get
{
if (TimeZone == null)
return "";
return TimeZone;
}
set { TimeZone = value; }
}
"类型为'System '的未处理异常。StackOverflowException发生"
我没有看到任何直接的递归。
如果代码有问题,我应该用什么来纠正它?
set { TimeZone = value; }
setter是递归的。
必须使用如下字段:
string _timeZone;
public string TimeZone
{
get
{
if (_timeZone== null)
return "";
return _timeZone;
}
set { _timeZone= value; }
}
get
和set
都是通过再次调用自己而递归的。试试这个:
string timeZone;
public string TimeZone
{
get { return timeZone == null ? string.Empty : timeZone; }
set { timeZone = value; }
}
试试这个
public string TimeZone
{
get
{
if (m_TimeZone == null)
return "";
return m_TimeZone;
}
set {m_TimeZone = value; }
}
其中m_TimeZone
为关联变量
您正在访问属性TimeZone
中的相同属性TimeZone
,您应该访问和使用相关变量
在getter中,你正在访问getter本身,这会导致递归调用属性getter本身
if (TimeZone == null)
Setter也是递归的
set { TimeZone = value; }
因此取决于调用代码,getter或setter由于多次调用属性(get_TimeZone() / set_TimeZone()
方法)而导致堆栈溢出。
所以引入backbackfield并在property中使用它,这是一种常见的技术,我很奇怪为什么你不知道这么简单的东西