我们的代码允许用户设置参数及其值。 值可以是对另一个参数的引用。
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。
如何避免这种情况? (如果检测到循环引用 - 以某种方式抛出异常/句柄)
建议的实施是保留当前解决执行中已经查找的术语列表(“搜索历史”)。
对于每个步骤,查看当前搜索的参数是否在历史记录中,如果是 - 我们已经查看过它,并且我们必须处于循环中。
这种方法的缺点是它很浪费(为每个参数解决发生的新分配。)
答案 0 :(得分:1)
如上所述,将递归方法的签名重写为Parameter.Get(string, int)
。使用int作为递归深度计数器。每次方法需要评估更深的参数时,减少int变量。当它达到0时,停止处理参数。 int的初始值可以是一个非常小的数字,因为很少有人会使用20个递归参数。