我们的代码允许用户设置参数及其值。一个值可能是对另一个参数的引用。
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。
如何避免这种情况?(如果检测到循环引用 - 以某种方式抛出异常/句柄)
建议的实现是保留在当前解析执行中已经查找的术语列表(“搜索历史”)。
对于每一步,查看当前搜索的参数是否在历史记录中,如果是 - 我们已经查看过它,并且我们必须在一个循环中。
这种方法的缺点是浪费(为每个发生的参数解析分配一个新列表)。