75257


素朴な疑問なのですが、C# のStackTrace は  
・static クラスの Environment が持つプロパティ  
・static でない Diagnostics名前空間の StackTrace クラス  
が担当しています。  
クラスである分、後者の方が持っている情報は多いということは分かりますが、  
なぜ２つあるのか疑問が生じます。

【１】この両者の、情報量以外の相違点は？（存在意義等を解説していただけると、とてもありがたいです）  
【２】static として StackTrace クラスが存在しないのは何故か？

* * *

なお、この質問の動機は、メソッド内のエラー処理において下記のような書き方を思い立ったためです；

[code]

    try { ... }
    catch (Exception ex)
    {
        var sf = new StackFrame();
        throw new Exception(sf.GetMethod().Name + "=>" + ex.Message);
    }
    
[/code]

**【参考】**  
[System.Environment.StackTrace プロパティ](https://docs.microsoft.com/ja-
jp/dotnet/api/system.environment.stacktrace?view=net-5.0#System_Environment_StackTrace)  
[System.Diagnostics.StackTrace クラス](https://docs.microsoft.com/ja-
jp/dotnet/api/system.diagnostics.stacktrace?view=net-5.0)


CC BY-SA 4.0
2021-04-14T01:14:26.057
75255
2021-04-14T02:57:38.640
38266
question
c#
C# のStackTrace について


２つあるわけではありません。

[`Environment.StackTrace`プロパティ](https://github.com/dotnet/runtime/blob/v5.0.0/src/coreclr/src/System.Private.CoreLib/src/System/Environment.CoreCLR.cs#L89-L93)は

[code]

    public static string StackTrace
    {
        [MethodImpl(MethodImplOptions.NoInlining)] // Prevent inlining from affecting where the stacktrace starts
        get => new StackTrace(true).ToString(System.Diagnostics.StackTrace.TraceFormat.Normal);
    }
    
[/code]

とあるように`System.Diagnostics.StackTrace`インスタンスを作成して`ToString()`を呼んでいるだけです。コメントにもあるようにインライン展開されてしまうと期待するスタックトレースが得られない可能性もあり、そういったケアも行われています。

つまり書式に特にこだわらずスタックトレース文字列を簡単に入手したい場合は、`Environment.StackTrace`プロパティを使えばよく、それには満足できず、出力内容にこだわる場合は、`System.Diagnostics.StackTrace`を使いましょう。

* * *

> この質問の動機は、メソッド内のエラー処理において下記のような書き方を思い立ったためです

[予約済みの属性:呼び出し元情報を判断する](https://docs.microsoft.com/ja-
jp/dotnet/csharp/language-reference/attributes/caller-
information)で説明されていますが、呼び出し元のメソッド名を入手する方法が用意されています。

メソッド引数に

[code]

    [CallerMemberName] string memberName = ""
    
[/code]

を加えると、`memberName`には呼び出し元のメソッド名やプロパティ名が渡されます。  
この機能は.NET Framework 4.5以降で使えます。


CC BY-SA 4.0
2021-04-14T02:51:36.233
75257
2021-04-14T02:57:38.640
2021-04-14T02:57:38.640
4236
4236
75255
answer