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

本文探讨了在实现循环队列时,Length属性set部分可能导致的递归调用及栈溢出问题,并提供了正确的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自己实现循环队列时,把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作用域内部代码去掉,使用自动属性即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值