检测递归

      我们编写一些比较复杂的程序时,可能会碰到递归,比如修改对象1的数据时,程序会相应的修改对象2的数据,而修改对象2的数据是,程序也要相应的修改对象1的数据,如此一来,就会碰到递归,相信有些人碰到过这种情况吧。对于这种情况,很自然的定义一些标志变量来进行判断,当修改对象1的数据前,设置一个标记,修改数据完毕后取消标记,而对象2修改对象1的数据前首先判断这个标记,若已经设置了该标记则不去修改对象1的数据,否则去修改对象1的数据。但这样做不大方便,需要专门定义公开成员来处理这种情况,

    在这里,小弟提出以下方法,使用应用程序的调用堆栈来判断是否存在递归。.NET程序可以从类型System.Diagnostics.StackTrace中获得当前应用程序的调用堆栈。StackTrace的FrameCount属性表示堆栈的层数,而StackTrace的GetFrame函数返回StackFrame对象,该对象保存着单个堆栈层的信息。StackFrame的GetMethod成员返回该堆栈层执行的方法的对象。根据StackTrace和StackFrame对象,我们可以遍历整个堆栈来判断是否出现递归。为此小弟写下一个例程。 

///   <summary>
///  检查调用本方法的方法是否发生了递归
///   </summary>
///   <remarks> 本函数是利用应用程序调用堆栈来判断是否存在递归 </remarks>
///   <returns> 若发生了递归则返回true,否则返回false </returns>
public   static   bool  CheckRecursion()
{
   System.Diagnostics.StackTrace myTrace 
=   new  System.Diagnostics.StackTrace();
   
//  若堆栈小于三层则不可能出现递归
    if  (myTrace.FrameCount  <   3 )
      
return   false ;
   System.IntPtr mh 
=  myTrace.GetFrame( 1 ).GetMethod().MethodHandle.Value;
   
for  ( int  iCount  =   2 ; iCount  <  myTrace.FrameCount; iCount ++ )
   {
      System.Reflection.MethodBase m 
=  myTrace.GetFrame(iCount).GetMethod();
      
if  (m.MethodHandle.Value  ==  mh)
      {
         
return   true ;
      }
   }
   
return   false ;
}


只要在某个函数中随意的调用CheckRecursion函数,就可以判断是否出现递归。而且根据这个原理,我们还可以获得递归的次数。

   这种方法使用比较方便,但实践证明,它是比较慢的,因此不适合非常频繁的调用。当需要频繁反递归时,还是要老老实实的使用标记变量来进行判断。

XDesigner软件工作室( http://www.xdesigner.cn )

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值