自己实现循环队列时,把Length属性的set作用域部分写成如下:
public int Length
{
get
{
return (rear -front +maxSize) %maxSize;
}
set
{
Length = value;
}
}
仔细分析下就知道set作用域编译后其实对应的是一个方法,使用ildasm.exe反编译的IL代码如下:
.methodpublic hidebysigspecialname instancevoid
set_Length(int32 'value') cilmanaged
{
// 代码大小 10 (0xa)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: call instance void class CycleQueue`1<!T>::set_Length(int32)
IL_0008: nop
IL_0009: ret
} // end of methodCycleQueue`1::set_Length
看不懂IL代码没关系,只要知道set对应的是一个方法就行了,这样在set部分又给Length属性复制,这就会导致循环调用对应的set方法(递归没有出口了),是个死循环,因此.net运行时直接报错:栈溢出。栈的一个重要用途就是用于递归。
纠正这个错误,把Set作用域内部代码去掉,使用自动属性即可。