当引发异常时返回堆栈跟踪时,如何进行C#尾递归优化

Car*_*ngo 5 c# tail-call tail-call-optimization

我在C#中看到了一些关于丢失尾部调用优化的问题,据说这种语言不适合递归算法实现.然而,这引出了一个问题,我们如何进行尾调用优化,并在引发异常时或者可以使用反射来检查调用堆栈并对其进行操作时仍提供合理的堆栈跟踪.

Jon*_*eet 5

好吧,只有你希望获得准确的堆栈跟踪才有意义:)

尾部调用优化不是唯一可以破坏堆栈跟踪的东西 - 最简单的例子是内联,这肯定会影响事物.基本上,任何依赖堆栈跟踪准确的东西都会冒一点风险.

以下是这个问题的一个非常简单的例子:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在没有调试器的情况下构建和运行,您可能会得到:

at Program.Call3()
at Program.Main(String[] args)
Run Code Online (Sandbox Code Playgroud)

基本上,要小心堆栈跟踪的作用.