• 检测递归


          我们编写一些比较复杂的程序时,可能会碰到递归,比如修改对象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 )

  • 相关阅读:
    select选择框去掉默认的下拉箭头
    网站怎么添加ico小图标
    js实现逐字打印效果,文本逐字显示
    jQuery实现消息列表循环垂直向上滚动
    滤镜图片变黑白+图片模糊
    多选下拉框(select 下拉多选)
    JavaScript 数组相关基础方法
    h5+ IOS App中判断本地文件是否存在 plus.io.resolveLocalFileSystemURL()
    h5+ IOS App中取消视频默认全屏播放
    C# 多线程与队列操作小练刀
  • 原文地址:https://www.cnblogs.com/xdesigner/p/465483.html
Copyright © 2020-2023  润新知