質問

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

これは.NET 4.5で追加されました。

@rokenの回答はこちら:

C#には__LINE__ __FILE__に相当するものがありますか

これを使用:

public static string CallerName([CallerMemberName] string callerName = "")
{
    return callerName;
}

使用例:

s_log.DebugFormat("{0}", CallerName());

それを使用することの欠点は、呼び出し元の名前を印刷するたびに、関数==>にジャンプする必要があることです。時間のかかる&パフォーマンスヒット! ですから、デバッグ目的で使用し、実稼働コードでも印刷する必要がある場合は、通常、関数名をlog.Debugにインライン化します。 :

s_log.Debug("CallerName");

HTH ..

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top