据我所知,像Debug.WriteLine()
这样的语句在Release构建中不会留在代码中。另一方面,Trace.WriteLine()
在Release构建中将留在代码中。
是什么控制了这种行为?当定义了DEBUG
时,C#编译器是否忽略了System.Diagnostics.Debug
类中的所有内容?
我只是想了解C#的内部工作原理,很好奇。
据我所知,像Debug.WriteLine()
这样的语句在Release构建中不会留在代码中。另一方面,Trace.WriteLine()
在Release构建中将留在代码中。
是什么控制了这种行为?当定义了DEBUG
时,C#编译器是否忽略了System.Diagnostics.Debug
类中的所有内容?
我只是想了解C#的内部工作原理,很好奇。
ConditionalAttribute
来指定它们应该何时被包含。DEBUG
被指定为一个#define
,通过命令行或系统环境(在shell中设置set DEBUG = 1
),标记有[Conditional("DEBUG")]
的方法将被编译器包括。当没有包括DEBUG
时,这些方法和任何对它们的调用都将被省略。您可以自己使用这个机制在某些情况下包含方法,它也用于控制Trace
调用,如Trace.WriteLine
(这使用了TRACE
定义)。ConditionalAttribute
引起的;只有在定义了该符号时,编译器才会忽略标记为条件的方法的调用。[Conditional("BLUE")]
void Bar() {...}
只有在定义了BLUE时才会调用。
请注意,为使“确定赋值”工作,存在一些限制:
(出于类似原因,对于部分类似的原因,partial
方法也适用相同的限制)