.NET程序报错:Process is terminated due to StackOverflowException.

自己实现循环队列时,把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`1T>::set_Length(int32)

  IL_0008: nop

  IL_0009: ret

} // end of methodCycleQueue`1::set_Length

看不懂IL代码没关系,只要知道set对应的是一个方法就行了,这样在set部分又给Length属性复制,这就会导致循环调用对应的set方法(递归没有出口了),是个死循环,因此.net运行时直接报错:栈溢出。

栈的一个重要用途就是用于递归。

纠正这个错误,把Set作用域内部代码去掉,使用自动属性即可。

你可能感兴趣的:(C#学习记录)