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

C# 为什么这个简单的代码会导致堆栈溢出异常?,c#,.net,recursion,C#,.net,Recursion,堆栈溢出异常在该属性的setter方法中引发: public string TimeZone { get { if (TimeZone == null) return ""; return TimeZone; } set { TimeZone = value; } } “发生“System.StackOverflowException”类型的未处理异常” 我在这里没有看到任何直接的递归 如果代码有问题,我

堆栈溢出异常在该属性的setter方法中引发:

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; }
}
试试这个

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

            return m_TimeZone;
        }
        set {m_TimeZone = value; }
    }
其中
m_时区
应为关联变量


您正在访问相同的属性
TimeZone
内部属性
TimeZone
,您应该在该属性中访问并使用getter中的关联变量以访问getter本身,这会导致对属性getter本身的递归调用

 if (TimeZone == null) 
Setter也是递归的

set { TimeZone = value; } 
因此,根据调用代码的不同,getter或setter会由于多次调用属性而导致堆栈溢出(
get\u TimeZone()/set\u TimeZone()
引擎盖下的方法)


因此,引入backing字段并在property中使用它,这是一种常见的技术,我想知道为什么您不知道这么简单的东西。

get和
set
都是通过再次调用自己来递归的。请尝试以下方法:

string timeZone;

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

正如jgauffin在下面所述,当您调用return TimeZone时,实际发生的是您再次调用TimeZone属性。所以它进入一个无限循环,总是一次又一次地调用它的self。是的(我在代码示例中也更改了它),但我回答了一个问题,即setter为什么会生成堆栈溢出。