実動コードのSystem.Diagnostics.Debug.WriteLine
-
05-07-2019 - |
質問
おそらくこれをすでに知っているはずですが、確信が持てず、文書化されていません。
開発プロセス中にSystem.Diagnostics.Debug.WriteLineを頻繁に使用して、コードのデバッグ中に変数または例外の変更を追跡できるようにします。これは、開発を容易にし、開発中に何が起こっているかをのみ理解することを目的としています。私は通常、本番に行くときにコードをコメントアウトするか削除します。
コードをコメントアウトするのを忘れるとどうなりますか。たとえば、開発サイクル中に、Debug.Write Lineを使用して出力ウィンドウへの接続を記録するエラー情報を追跡しているとします。開発中は明らかにこれで問題ありませんが、ライブを開始するとき、ここにリスクがあるかどうかは疑問です。誰かが私のライブ実行可能ファイルにデバッガをアタッチしてこの出力をトラップできますか?または、Visual Studioでのみ出力を生成するものですか?
そして、デバッグからリリースに切り替えるときはどうでしょうか?リリース用にコンパイルすると、このコードはコンパイラーによって無視されますか?
解決
Debugクラスのすべてのメンバーには、 ConditionalAttribute 。したがって、呼び出しサイトはリリースビルドにコンパイルされません。
他のヒント
System.Diagnostics.Debug
メソッド呼び出しは、" DEBUG"条件付きコンパイルシンボルが定義されています。デフォルトでは、" DEBUG"シンボルはデバッグビルドに対してのみ定義されます。
サポートするコンパイラ
ConditionalAttribute
への呼び出しを無視 " DEBUG"を除き、これらのメソッドは 条件付きコンパイルとして定義 シンボル。
すべてのDebugメソッドには[Conditional(" DEBUG")]属性があるため、DebugからReleaseに切り替えても、それらのメソッドの呼び出しが削除されるので、心配する必要はありません。リリースビルドの他の最適化を使用)。
デバッグ情報は、デバッグモードで実行している場合にのみ表示されます。 リリースモードでは、デバッグステートメントは表示されません(これらのステートメントをリリースモードで表示したい場合は、デバッグの代わりにトレースを使用できます) 。
/ d:DEBUG
オプションまたは #define DEBUG
オプションなしでコンパイルする場合、WriteLine呼び出しはリリースコードに物理的に存在しません。サードパーティが文字通りリリースバージョンにないため、これらの呼び出しから情報を回復する方法はありません。
Debugのほとんどすべてのメンバーは、ConditionalAttributeでマークされます。 C#などのコンパイラは、リリースビルド中にこれらのメソッドの呼び出しをスキップするため、安全です。
モード情報はこちら: http://msdn.microsoft.com/en-us/ library / system.diagnostics.debug.aspx