我看到一些有关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/

10-10 19:28