预定义指令之debug
1)根据你必须知道的.NET一书,
#define DEBUG class Program { static void Main(string[] args) { #if DEBUG Console.WriteLine("debug mode"); #else Console.WriteLine("release mode"); #endif } }
代码很简单,但其实这段代码是有问题的。
原因出在,其实vs中内置了DEBUG,所以无需在开头再定义DEBUG。还是stackoverflow这里讲得比较正确。
把第一行去掉后,编译选项选择debug/release的切换,就能切换编译的结果了。
2)关于ConditionAttribute
class Test { static void Main() { Foo(); Console.Read(); } [Conditional("DEBUG")] static void Foo() { Console.WriteLine("debug mode"); } }
在DEBUG模式下,Foo能运行,否则编译时就会被跳过。
对上面的一点扩展:
#define mydefineSymbol using System; using ... class Test { static void Main() { Foo(); Console.Read(); } [Conditional("mydefineSymbol")] static void Foo() { Console.WriteLine("debug mode"); } }
在第一行定义了mydefineSymbol之后,这样,Foo就会被编译器包括进来;否则则不被编译。
3)很多时候,我们需要在测试环境下一套逻辑,生产环境中用另一套,那么可以使用在项目属性对话框中,自定义条件编译符号,这样,不用在每个文件最上手动添加一个#define。
代码是:
static void Main() { #if !Produce Console.WriteLine("Produce"); #endif Console.Read(); }
如果是Debug模式,则会编译该条件;如果是Release则会忽略。
注意:
1)DEBUG是大小写敏感的,写成Debug或debug是无用的。
2)写Release是没有用的。原因是只有DEBUG这个词在VS中被预定义了。