5

C#で末尾呼び出しの最適化が欠落しているために、言語が再帰的なアルゴリズムの実装に適していないという質問がいくつかあります。ただし、これは疑問を投げかけます。例外が発生した場合、またはリフレクションを使用して呼び出しスタックを検査して処理する場合に、末尾呼び出しの最適化を実行し、適切なスタックトレースを提供するにはどうすればよいですか。

4

1 に答える 1

6

まあ、それはあなたが正確なスタックトレースを取得することを期待している場合にのみ重要です:)

スタックトレースを破壊する可能性があるのは末尾呼び出しの最適化だけではありません。最も単純な例はインライン化であり、これは確かに物事に影響を与える可能性があります。基本的に、スタックトレースが正確であることに依存するものはすべて、少しリスクを伴います。

まさにその問題の非常に簡単な例を次に示します。

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)

基本的に、スタックトレースの操作には注意してください。

于 2010-10-21T21:37:28.187 に答える