在递归函数中防止StackOverFlow

Xaq*_*ron 8 c# stack-overflow reflection

我有一个递归函数,BaseClass它依赖于protected virtual函数的返回条件.

子类可能会错误地覆盖此函数并导致StackOverFlow异常.最糟糕的是网络呼叫速度很慢,而且不会很快发生异常(许多资源浪费很长时间).

我正在寻找StackOverFlow一种在基类中以某种方式检查早期阶段的方法(可能使用Reflection和当前的递归级别).

任何的想法 ?

Ian*_*cer 8

您可以将一个简单的整数"深度"传递给递归函数,并在每次后续调用时递增它.如果它大于允许的最大深度,则抛出异常,而不是等到它太晚并且StackOverflow发生了可怕的异常.

这样的安全机制(增量计数器,检查它不是非常大)也可以在while循环中使用,其中小错误可能导致无限循环消耗大量CPU.

在具有许多用户(例如网站)的大型系统中,有时最好采用递归和循环等预防措施,因为后果可能远远超出一个网页或系统的一个用户.这不是漂亮的代码,纯粹主义者无疑会对此不屑一顾,但它是有效的,它是防御性的,而且是务实的.

  • 没办法,Ian Mercer在这里发帖? (3认同)
  • @Xaqron,我不会像那样使用ref int.当方法调用自身时,我会传递深度+ 1,并在方法内部检查深度.例如,在树搜索中,您可能不希望限制访问的总节点数,但您可能希望确保它不会卡在某个循环中,因为树不是正确的树. (3认同)