3

次のステートメントを使用して、現在の関数 (イベント ハンドラーなど) の名前を Visual Studio (2010) の [出力] ウィンドウに出力します。

Debug.Write(MethodBase.GetCurrentMethod().Name);

これを , などのユーティリティ関数内に配置するDisplayFunctionName()と、それを呼び出す親関数の代わりに、毎回表示されるのは " DisplayFunctionName" - 驚くことではありません!

C# にはインライン化がないことはわかっていますが、このようなステートメントを複製する必要がないように、「スニペット」を使用する以外に、この状況に対する別の解決策はありますか?

4

1 に答える 1

11

を使用しCallerMemberNameAttributeて、発信者の名前を表示できます。

public void WriteDebug(string message, [CallerMemberName] string memberName = "")
{
    Debug.Write("[" + memberName + "] " + message);
}

さらに診断するためにこの情報を含めるために使用できるともCallerLineNumberAttributeあります。CallerFilePathAttributeこれらの属性については、MSDN で詳しく説明されています。on メソッドと組み合わせると[Conditional("DEBUG")]、リリース ビルドでは完全に排除されるデバッグ中に多くの情報を提供できます。

C# にはインライン化がないことはわかっていますが、このようなステートメントを複製する必要がないように、「スニペット」を使用する以外に、この状況に対する別の解決策はありますか?

これは、診断のために呼び出し元のメンバーの情報を取得することと同様に、「インライン化」とは直接関係がないことに注意してください。そうは言っても、JIT はコードの実行時にインライン展開を確実に実行します。これは、C# のパフォーマンスが優れている主な理由の 1 つです。

これには Visual Studio 2012 が必要です。これは、そのリリースの新しいコンパイラ機能を使用して機能するためです。


StackTrace古いコンパイラを使用している場合、スタック トレース情報を取得するために使用する別の方法があります。ただし、これはパフォーマンスにかなり大きな影響を与えるため、デバッグ中の診断には引き続き機能しますが、少なくとも本番環境ではタイトループで使用するものではありません.

string callingMethodName = (new StackTrace()).GetFrame(1).GetMethod().Name;
于 2013-04-23T16:56:11.453 に答える