0

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

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。

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

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

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

这种方法的缺点是浪费(为每个发生的参数解析分配一个新列表)。

4

1 回答 1

1

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

于 2012-05-30T17:27:16.817 回答