2

クライアントが出力のデバッグを支援できるように、トレース情報の出力を頻繁に必要とするコードのチャンクがあります。これは非常に数学指向です。

パフォーマンス上の理由から、本番環境でトレースを有効にしたくないのは確かですが、頻繁にコメントアウトしたりコメントアウトしたりする必要があるのは面倒です。

私はちょうどこのようなコードをセットアップしました...

using System.Diagnostics;

const bool TRACING_ENABLED = false;

//math math math....

Trace.WriteLineIf(TRACING_ENABLED, "Minimum Nitrogen Yield: " + minYieldNitrogen);
Trace.WriteLineIf(TRACING_ENABLED, "Minimum Water Yield: " + minYieldWater);
Trace.WriteLineIf(TRACING_ENABLED, "Minimum Seed Yield: " + minYieldSeed);

//more math math trace math trace math...

私の質問は...これがデバッグ用のトレースを有効または無効にする最良の方法ですか? この種の行はコード全体に散らばっているのでif、ハウスキーピングのためにブロックなどをラップする必要がないようにしたいと考えていました。

falseこれらの行はビルド時に定数が提供されるため、コンパイラはアセンブリからこれらの行を最適化しますか?

あなたの洞察に感謝します!

4

4 に答える 4

3

代わりに、 ConditionalAttributeとコンパイラ フラグを使用してこれを処理します。

これには、本番コードからメソッドを完全に削除できるという利点があります。そのため、条件チェックは発生しません。

これを行うと、次のような独自のメソッドを作成できます。

[Conditional("TRACE")]
public WriteTraceLine(string message)
{
     Trace.WriteLine(message);
}

そして、TRACEデバッグ/非本番ビルド設定にフラグを立てます。これにより、そのフラグが定義されている場合、メソッドはコンパイル済みソース (呼び出しを含む) にのみ存在します。

于 2012-05-25T18:31:05.910 に答える
2

Debug.WriteLine() メソッドも見てみましょう。すべての Debug メソッドは Reed の Conditional 属性を使用しますが、代わりに "DEBUG" 定数の定義に基づいています (これはデフォルトの Debug ビルド構成で無料で取得でき、デフォルトの Release ビルド構成にはありません)。Debug メソッドは、Trace と同じリスナーのコレクションを使用します。ソフトウェアの任意のビルドでログに記録または表示したいものには Trace.WriteLine() を使用し、ソフトウェアのデバッグ ビルドでログに記録または表示したい追加のテキストには Debug.WriteLine() を使用するという考え方です。

于 2012-05-25T18:37:49.730 に答える
0

たぶん、あなたができることは、独自のクラスを書くことです

public class MyTrace 
{
     [Conditional("TRACE")]
     public static void Trace(string message)
     {
          //trace code goes here
     }
     [Conditional("DEBUG")] 
     public static void Debug(string message)
     {
          //Debug code goes here
     }
}

これの利点は、条件付きコンパイルを使用したり、構成ロジックを追加したり、Log4Net のようなロギング パッケージを使用したりできることです。

もちろん、あなたはそれを使うでしょう

  ....
  MyTrace.Trace(".....");
  MyTrace.Debug(".....");
  ....
于 2012-05-25T18:49:58.423 に答える
0

の代わりにTrace.WriteLineIf(condition, message)、 を使用しますDebug.WriteLine(message)

デバッグ ビルドでは、このメソッドの呼び出しは正常にコンパイルされます。リリース ビルドでは、コンパイラは呼び出しやパラメーター評価のコードを出力しません。私があなたの質問を正しく理解していれば、これはまさにあなたが望むものです。

正確にDebug.WriteLine(message)は、[ConditionalAttribute("DEBUG")]適用されています。DEBUGその結果、コンパイラは、コンパイル中にシンボルが定義されている場合にのみ、それへの呼び出しのコードを発行します。このシンボルは、標準の Visual Studio デバッグ ビルドで定義されていますが、リリース ビルドでは定義されていません。

詳細については、 http://msdn.microsoft.com/en-us/library/9z9k5ydzおよびhttp://msdn.microsoft.com/en-us/library/system.diagnostics.conditionalattribute.aspxを参照してください

于 2012-05-25T18:41:52.770 に答える