Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 保护递归操作不受循环影响_C#_.net - Fatal编程技术网

C# 保护递归操作不受循环影响

C# 保护递归操作不受循环影响,c#,.net,C#,.net,我们的代码允许用户设置参数及其值。 值可以是对另一个参数的引用 Parameter.Set("Parameter1", "%Parameter2%"); Parameter.Set("Parameter2", "%Parameter1%"); 此值的实际解析使用Regex类的Replace方法递归解析%符号内的任何引用,并替换它们: // Pseudo code (the actual parameter name is retrieved and replaced with its valu

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

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

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

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

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


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

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

我在寻找特定的模式(包含在特定符号中的文本,比如百分比)。正则表达式帮助我在一个方法调用中识别并替换所有这些。您正在寻找一个特定的子字符串,并希望替换它。string.Replace()可以做到这一点。为什么要使用Regex.Replace()?使用string.Replace没有什么区别,对于每个字符串替换,我需要按照类似的逻辑解析参数的实际值。哦,不,这与问题完全无关。如果可以使用string.Replace(),则没有理由使用Regex.Replace()。Replace()可以获得可预测的性能。Regex.Replace()可能会爆炸。你提出的问题的答案是使用计数器。使用Parameter.Get(x,int)代替Parameter.Get。显式限制可以计算参数的次数。这将允许您取消更复杂的循环。谢谢。这是我没有考虑过的一种方法。尽管用户可能能够定义一个由20个参数组成的相互关联的链。我应该在哪里设置确切的限制?这种方法有些猜测。