据我所知,像Debug.WriteLine()
这样的语句不会留在Release版本的代码中。另一方面,Trace.WriteLine()
将保留在Release版本的代码中。
是什么控制了这种行为?在定义System.Diagnostics.Debug
时,C#编译器是否忽略DEBUG
类中的所有内容?
我只是想了解C#的内部并且只是好奇。
答案 0 :(得分:6)
这些方法使用ConditionalAttribute
指定何时应包括它们。
将DEBUG
指定为#define
,通过the command line或系统环境(shell中为set DEBUG = 1
)时,标有[Conditional("DEBUG")]
的方法将包含在编译器中。如果未包含DEBUG
,则将省略这些方法和对它们的任何调用。您可以自己使用此机制在某些情况下包含方法,它还可用于控制Trace
调用,例如Trace.WriteLine
(这使用TRACE
定义)。
答案 1 :(得分:5)
这是由于ConditionalAttribute
;除非定义了符号,否则编译器会忽略对标记为条件的方法的调用。
你可以拥有自己的:
[Conditional("BLUE")]
void Bar() {...}
仅在定义BLUE时调用。
请注意,要使“明确分配”工作有一些限制:
(出于类似原因,同样的限制适用于partial
方法)