为什么这个简单的代码会导致堆栈溢出异常?

本文关键字:堆栈 栈溢出 异常 简单 代码 为什么 | 更新日期: 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; }
}

getset都是通过再次调用自己而递归的。试试这个:

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中使用它,这是一种常见的技术,我很奇怪为什么你不知道这么简单的东西