質問
C#バージョンのC ++ __FUNCTION__マクロに適したソリューションはありますか?コンパイラはそれを好まないようです。
解決
代わりにこれを使用してみてください。
System.Reflection.MethodBase.GetCurrentMethod().Name
C#にはC ++などの __ LINE __
や __ FUNCTION __
マクロはありませんが、同等のものがあります
他のヒント
現在使用しているのは、次のような関数です。
using System.Diagnostics;
public string __Function() {
StackTrace stackTrace = new StackTrace();
return stackTrace.GetFrame(1).GetMethod().Name;
}
__ FUNCTION__が必要な場合は、代わりに__Function()を呼び出します。例:
Debug.Assert(false, __Function() + ": Unhandled option");
もちろん、このソリューションもリフレクションを使用しますが、私が見つけることができる最良のオプションです。デバッグにのみ使用するため(リリースビルドではトレースしません)、パフォーマンスヒットは重要ではありません。
デバッグ機能を作成してタグ付けする必要があると思います
[ Conditional("Debug") ]
代わりに、私はそれを回避していません。
これに対するソリューションを提供してくれたJeff Mastryに感謝します。
残念ながら、C#にはそのマクロに相当するバージョンはありません。 GetCurrentMethodName()ソリューションがC ++ __FUNCTION__マクロに相当するとは考えません。つまり、C ++バージョンは、コンパイル時の名前の計算です。 C#の場合、これはランタイム計算であり、パフォーマンスヒットが発生します。
コストの重大度については何も仮定していませんが、1つあります
次のように動作しますが、コンパイル中ではなく実行時に評価されます。
System.Reflection.MethodBase.GetCurrentMethod().Name
これを使用:
public static string CallerName([CallerMemberName] string callerName = "")
{
return callerName;
}
使用例:
s_log.DebugFormat("{0}", CallerName());
それを使用することの欠点は、呼び出し元の名前を印刷するたびに、関数==>にジャンプする必要があることです。時間のかかる&パフォーマンスヒット! ですから、デバッグ目的で使用し、実稼働コードでも印刷する必要がある場合は、通常、関数名をlog.Debugにインライン化します。 :
s_log.Debug("CallerName");
HTH ..