如果我使用set访问器更改C#中的静态类成员,为什么会出现堆栈溢出错误?
我并不认为这是一个错误,我只是想知道机器内部究竟发生了什么。
答案 0 :(得分:46)
你不应该;我希望你有类似的东西:
private static int foo;
public static int Foo {
get {return foo;}
set {Foo = value;} // spot the typo!!! (should be foo)
}
基本上,set
是:
static void set_Foo(int value) {
set_Foo(value);
}
所以这是递归的,并最终消耗堆栈(假设没有优化等)。
如果没有代码示例,则无法进行更多诊断。
答案 1 :(得分:6)
我猜你正在做这样的事情:
public class MyClass
{
public int TheInt
{
get
{
return TheInt;
}
set
{
TheInt = value; // assignment = recursion!
}
}
问题是,在TheInt的set函数中,您要为TheInt赋值,这将导致对set函数的嵌套调用。你得到递归,然后堆栈溢出。
答案 2 :(得分:5)
在调试器中查看你的调用堆栈(当抛出异常时你会停止,对吗?)这应该可以强烈显示正在发生的事情。
答案 3 :(得分:1)
我想我对这个问题有不同的解释。问题不在于溢出发生的原因,而是访问器可能导致溢出的原因。在这种情况下,访问器是一个函数调用,就像任何其他函数调用一样,因此它确实占用了堆栈空间。
如果您使用没有访问者的公共成员,MyClass.myint
不会成为函数调用,并且不能溢出堆栈。
答案 4 :(得分:0)
你想知道内部发生了什么导致堆栈溢出?
您的方法调用另一个导致无限递归的方法:A调用A,堆栈溢出。 A调用B,然后B调用A,堆栈溢出。等等。
正如Marc Gravell所说,这可能是你的房产实施中的一个错误。