gpt4 book ai didi

c# - 有没有办法在 C# 中阻止或断言意外递归

转载 作者:太空宇宙 更新时间:2023-11-03 20:59:13 24 4
gpt4 key购买 nike

我正在处理一个庞大而复杂的事件驱动代码体,并且有很多机会不小心创建递归条件。

有时递归条件是暂时的,应用程序会自行 catch ,但即使这样通常也会造成不必要的延迟。其他时候它会创建一个计算器溢出,当它发生在客户端站点时通常很难调试。

我希望有一种方法可以将允许递归的代码部分列入黑名单或白名单。如果递归条件在 DEV 期间发生,那么我希望它断言以便我可以更正代码。

我正在考虑的是让应用程序检查自己的堆栈,以确保它刚刚输入的方法不在堆栈中。

如有任何指点,我们将不胜感激。

注意:这是针对 Web 应用程序的,但我在多个环境中遇到过这个挑战。

最佳答案

你可以像这样检查堆栈:

[MethodImpl(MethodImplOptions.NoInlining)]
// optionally decorate with Conditional to only be used in Debug configuration
[Conditional("DEBUG")]
public static void FailIfCallerIsRecursive() {
var trace = new StackTrace();
// previous frame is the caller
var caller = trace.GetFrame(1).GetMethod();
// inspect the rest
for (int i = 2; i < trace.FrameCount; i++) {
// if found caller somewhere up the stack - throw
if (trace.GetFrame(i).GetMethod() == caller)
throw new Exception("Recursion detected");
}
}

然后把它称为开始:

void MyPotentiallyRecursiveMethod() {
FailIfCallerIsRecursive()
}

但请注意,它非常昂贵。但是,由于您将仅在开发(调试)配置中使用它 - 为什么不呢。您还可以对其进行一些修改,使其仅在检测到特定级别的递归时抛出(因此调用者在堆栈中出现 X 次)。

关于c# - 有没有办法在 C# 中阻止或断言意外递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47352262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com