保护循环中的递归操作

时间:2012-05-30 17:03:38

标签: c# .net

我们的代码允许用户设置参数及其值。 值可以是对另一个参数的引用。

Parameter.Set("Parameter1", "%Parameter2%");
Parameter.Set("Parameter2", "%Parameter1%");

实际解析此值使用Regex类的Replace方法递归地解析%符号内的任何引用,并替换它们:

// Pseudo code (the actual parameter name is retrieved and replaced with its value.
Regex.Replace("%Parameter1%", match => Parameter.Get(match));

在这种情况下,循环引用将导致StackOverflowException。

如何避免这种情况? (如果检测到循环引用 - 以某种方式抛出异常/句柄)

建议的实施是保留当前解决执行中已经查找的术语列表(“搜索历史”)。

对于每个步骤,查看当前搜索的参数是否在历史记录中,如果是 - 我们已经查看过它,并且我们必须处于循环中。

这种方法的缺点是它很浪费(为每个参数解决发生的新分配。)

1 个答案:

答案 0 :(得分:1)

如上所述,将递归方法的签名重写为Parameter.Get(string, int)。使用int作为递归深度计数器。每次方法需要评估更深的参数时,减少int变量。当它达到0时,停止处理参数。 int的初始值可以是一个非常小的数字,因为很少有人会使用20个递归参数。