我看到一些有关C#中缺少尾部调用优化的问题,据说这使该语言不适用于递归算法实现。但是,这引出了一个问题,当引发异常或何时可以使用反射来检查调用栈并对其执行操作时,我们如何才能进行尾部调用优化并仍然提供合理的栈跟踪。
最佳答案
好吧,只有在您希望获得准确的堆栈跟踪时才有意义:)
尾调用优化并不是唯一可以破坏堆栈跟踪的事物-最简单的示例是内联,它肯定会影响事物。基本上,任何依赖堆栈跟踪的准确性都会带来一些风险。
这是一个非常简单的例子,说明了这个问题:
using System;
using System.Runtime.CompilerServices;
class Program
{
static void Main(string[] args)
{
try
{
Call1();
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
}
}
static void Call1()
{
Call2();
}
static void Call2()
{
Call3();
}
[MethodImpl(MethodImplOptions.NoInlining)]
static void Call3()
{
Call4();
}
static void Call4()
{
Call5();
}
static void Call5()
{
throw new Exception();
}
}
在没有调试器的情况下进行构建和运行,您可能会得到以下信息:
at Program.Call3()
at Program.Main(String[] args)
基本上,请小心处理堆栈跟踪。
关于c# - 引发异常时返回堆栈跟踪时,如何进行C#尾递归优化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3992172/