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

时间:2011-08-15 10:17:03

标签: c# .net recursion

此属性的 setter方法中抛出了堆栈溢出异常:

public string TimeZone
{
    get
    {
        if (TimeZone == null)
            return "";

        return TimeZone;
    }
    set { TimeZone = value; }
}

“发生了'System.StackOverflowException'类型的未处理异常”

我在这里看不到任何直接的递归。

如果代码有问题,我应该使用什么来纠正它?

4 个答案:

答案 0 :(得分:11)

set { TimeZone = value; }

setter是递归的。

您必须使用以下字段:

string _timeZone;

public string TimeZone
{
    get
    {
        if (_timeZone== null)
            return "";

        return _timeZone;
    }
    set { _timeZone= value; }
}

答案 1 :(得分:4)

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

string timeZone;

public string TimeZone
{
    get { return timeZone == null ? string.Empty : timeZone; }
    set { timeZone = value; }
}

答案 2 :(得分:1)

试试这个

  public string TimeZone
    {
        get
        {
            if (m_TimeZone == null)
                return "";

            return m_TimeZone;
        }
        set {m_TimeZone = value; }
    }

m_TimeZone应该与关联变量

您正在访问属性TimeZone内的相同属性TimeZone,您应该访问该属性并使用相关变量

答案 3 :(得分:1)

在getter中你自己访问getter,这会导致对属性getter本身的递归调用

 if (TimeZone == null) 

Setter也是递归的

set { TimeZone = value; } 

因此,取决于调用代码getter或setter会导致堆栈溢出,因为多次调用属性(引擎盖下的get_TimeZone() / set_TimeZone()方法)。

因此,介绍支持字段并在属性中使用它,这是一种通用技术我想知道为什么你不知道这些简单的东西。