C# 在C中重载getter和setter会导致堆栈溢出#
当我试图覆盖get和set函数时,我不确定是什么导致StackOverflowException。当我只使用默认的get和set时,它就工作了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
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;
}
}
}