2011-11-28 73 views
34

Visual Studio 2010では、プロジェクトのプロパティに移動して[ビルド]タブに移動すると、「TRACE定数の定義」チェックボックスが表示されます。 #define TRACEを実行するのと同じことです。.NET/Visual StudioでTRACE定数を定義する

System.Diagnostics.Traceのすべてのメソッドの周囲に[Conditional("TRACE")]があります。

私の質問はなぜあなたはこれをオフにしますか?つまり、トレースリスナーが定義されていない場合は、ログや何かを埋めるようなものではありません。それはちょうど私に不思議な感じです。 Traceを呼び出すための努力をしているのであれば、なぜApp/Web.configで制御したくないのでしょうか?代わりに、コンパイラスイッチを使って制御してください。再コンパイル。

何か不足していますか?確かに、それはパフォーマンスにとって悪いことはできませんよね?

+5

リスナーがない場合でも、Trace()を呼び出すことはできません。それを非常に高価にすることは困難ではない。 –

+0

私は十分に細かいとは思わない。デバッグでは、すべての情報(情報、冗長など)が必要な場合があるのに対し、特定の種類のイベントのみをログに記録したい場合があります(警告、エラー)。 TRACE_ERROR、TRACE_VERBOSEなどがあります。 – luksan

+0

TRACEの詳細とビルドの最適化については、http://stackoverflow.com/questions/6911863/setting-up-ac-sharp-application-for-max-performance-buildを参照してください。 。 – MBentley

答えて

27

おそらくこのチェックボックスは、/define:TRACEコンパイラオプションと同じです。何らかの理由(例:セキュリティ)でエンドユーザがトレース出力を見たり、パフォーマンスを向上したりしないようにするために、リリースビルドのこのオプションをオフにしたい場合があります。もちろん、パフォーマンスの向上は、実行時の作業量によって異なりますが、Conditional attributeは、生成されたILから関数呼び出し(文字列の書式などを含む)を完全に削除するため、は大きな違いがあります。

+1

関数呼び出しが完全に削除されていると言うと、呼び出しがno-opに置き換えられているとは言えますか?後者は、代わりにNOPをILに入れようとしているように聞こえますが、リンクされたMSDNのページはそれを示唆していません。 – Ashe

+2

ありがとうございます。([this thread](http://bytes.com/topic/c-sharp/answers/237540-conditional-debug-if-debug))の一番下にあるJon Skeetの答えで確認できます。私は私の答えを訂正しました。 –

関連する問題