C# アプリケーションにロギングまたはトレースを追加したいのですが、ログの詳細レベルが低く設定されているためにメッセージがログに記録されない場合に、文字列のフォーマットや値の計算のオーバーヘッドをログに記録したくありません。
C++ では、プリプロセッサを使用して、次のようにコードがまったく実行されないようにするマクロを定義できます。
#define VLOG(level,expr) if (level >= g_log.verbosity) { g_log.output << expr; }
次のように使用します。
VLOG(5,"Expensive function call returns " << ExpensiveFunctionCall());
C# でどのように行うのですか?
ここでトレースとデバッグ機能を説明している Microsoft ドキュメントを読みました。#undef DEBUG と #undef TRACE を使用すると、生成された実行可能ファイルからすべてのトレースとデバッグ コードが削除されると主張していますが、実際には呼び出し全体が削除されますか? つまり、私が書くなら
System.Diagnostics.Trace.WriteLineIf(g_log.verbosity>=5,ExpensiveFunctionCall());
TRACE の定義を解除すると、高価な関数が呼び出されないのですか? または、呼び出しを行ってから、何も追跡しないと判断しますか?
とにかく、それが削除されたとしても、これは C++ マクロよりも劣っています。なぜなら、その大きな醜い呼び出しを C++ での単純な VLOG() 呼び出しのように見せて、パラメーターの評価を回避することはできないからです。また、C++ のように実行時に冗長性を低く定義してオーバーヘッドを回避することもできません。