C# 在C中重载getter和setter会导致堆栈溢出#

C# 在C中重载getter和setter会导致堆栈溢出#,c#,.net,asp.net,properties,stack-overflow,C#,.net,Asp.net,Properties,Stack Overflow,当我试图覆盖get和set函数时,我不确定是什么导致StackOverflowException。当我只使用默认的get和set时,它就工作了 enum MyEnumType { .... } public MyEnumType data { get; set; } 但当我尝试添加其他数据时,它抛出一个StackOverflowException: public MyEnumType data { get { return data; } set { da

当我试图覆盖get和set函数时,我不确定是什么导致StackOverflowException。当我只使用默认的get和set时,它就工作了

enum MyEnumType
{
....
}

public MyEnumType data { get; set; }
但当我尝试添加其他数据时,它抛出一个StackOverflowException:

public MyEnumType data
{
  get
  {
    return data;
  }
  set
  {
    data = value;
  }
}

有什么想法吗?当我为ASP.NET用户控件属性执行此操作时,没有任何问题。为什么它会导致普通枚举数据类型的StackOverflowException?

您正在getter和setter中引用属性本身,这会导致无限递归(堆栈溢出)。如果您使用了标准的命名约定(数据),则会更加明显。 尝试以下方法:

private MyEnumType _data;

public MyEnumType Data
{
  get { return _data; }
  set { _data = value; }
}

是的,您没有支持字段。。。这是你应该做的:

private MyEnumType data;

public MyEnumType Data
{
  get
  {
    return data;
  }
  set
  {
    data = value;
  }
}
发生的情况是,您引用属性以返回自身,这会导致尝试访问其自身值的无限循环。因此,堆栈溢出

在您的情况下,如果不在get和set方法中添加任何附加逻辑,也可以使用自动属性。这是简单的定义如下:

public MyEnumType Data
{
  get;
  set;
}

属性的名称必须与成员名称不同。

在setter/getter和debug中放置一个断点,确保使用step-into(F11),而不是step-over-这应该有助于解释发生了什么。

递归调用公共getter(在getter中)!这就是为什么会出现堆栈溢出的原因。对于那些不知道的人来说,C#将属性作为两个独立的函数在引擎盖下实现。因此,对setter或getter的每次调用都会引入另一个堆栈层,最终导致堆栈溢出。
public class MyClass
{
    string propertyString;

    public string MyPropertyString
    {
        get
        {
            return propertyString;
        }
        set
        {
            propertyString = value;
        }
    }
}