C#中的调试与跟踪

kou*_*des 9 c# debugging

据我所知,语句Debug.WriteLine()不会留在Release版本的代码中.另一方面,Trace.WriteLine()将保留在Release版本中的代码中.是什么控制了这种行为?在定义System.Diagnostics.Debug时,C#编译器是否忽略了类中的所有内容DEBUG

我只是想了解C#的内部并且只是好奇.

Jef*_*tes 6

这些方法使用它ConditionalAttribute来指定何时应包含它们.

当通过命令行或系统环境(在shell中)DEBUG指定为a时#define,编译器将包含标记为的方法.如果不包含,则将省略这些方法和对它们的任何调用.您可以自己使用此机制在某些情况下包含方法,它也用于控制调用(这使用define).set DEBUG = 1[Conditional("DEBUG")]DEBUGTraceTrace.WriteLineTRACE


Mar*_*ell 5

这是由于ConditionalAttribute; 除非定义了该符号,否则编译器会忽略对标记为条件的方法的调用.

你可以拥有自己的:

[Conditional("BLUE")]
void Bar() {...}
Run Code Online (Sandbox Code Playgroud)

只有在定义BLUE时才会调用它.

请注意,有一些限制,以使"明确分配"工作:

  • 没有回报价值
  • 没有输出参数

(partial出于类似原因,同样的限制适用于方法)