“所谓的预处理指令,就是用来控制编辑器工作的一些指令。预处理指令从来不会转化为可执行代码中的命令,但会影响编译过程的各个方面。”
- 使用预处理器指令可以禁止编译器编译代码的一部分。如果计划发布两个版本的代码,即基本版本和有更多功能的企业版,就可以使用这些这些预处理预处理器指令。在编译软件的基本版本时,使用预处理器指令还可以禁止编译器编译与额外功能相关的代码。另外,在编写提供调试信息的代码时,也可以使用预处理器指令。所有的C#预处理器指令都是以符号#开头的。
1. #define和undef
#define指令告诉编译器存在给定名称的符号,这个符号不是实际代码的一部分,而只在编译器编译代码时存在。例如:
#define DEBUG
#undef指令和#define指令刚好相反,用来删除#define指令对符号的定义,例如:
#undef DEBUG
如果符号不存在,#undef就没有任何作用。同样,如果符号已经存在,#define也不起作用。
必须把#define和#undef命令放在C#源码的开头,在声明要编译的任何对象的代码之前。#define和#undef指令本身并没有什么用,但与其他预处理器指令(特别是#if)结合使用时,其功能就非常强大了。
Tips:
预处理器器指令不用分号结束,一般一行上只有一个命令。这是因为对于预处理器指令,C#不再要求命令用分号结束。如果它遇到一个预处理器指令,就会假定下一个命令在下一行上。
2. #if,#elif,#else和#endif
#if,#elif,#else和#endif指令告诉编译器是否需要编译某个代码块。例如:
#if Debug
Console.WriteLine("#IF预处理器指令");
#else
Console.WriteLine("#ELSE预处理器指令");
#endif
如果在C#源代码的开头声明了#define Debug则会输出:
#IF预处理器指令
如果是#undef Debug,则输出:
#ELSE预处理器指令
3. #warning和#error
当编译器遇到#warning和#error指令时,会分别产生警告和错误。如果编译器遇到#warning指令,会给用户显示#warning指令后面的文本,之后编译继续进行。如果编译器遇到#error指令,就会给用户显示后面的文本,作为一个编译错误信息,然后会立即退出编译,不会产生IL代码。
使用#error指令可以检查#define语句是不是做错了什么事,使用#warning语句可以让程序员想起做过什么事。例如:
#if DEBUG && RELEASE
#error "You've defined DEBUG and RELEASE simultaneously!'"
#endif
#warning "Dont't forget to remove this line before the boss tests the code!"
Console.WirteLine("* I hate this job*");
4. #line
#line指令可以用于改变编译器在警告和错误信息中显示的文件名和行号信息。如果编写代码时,在把代码发送给编译器钱,要使用某些软件包改变键入的代码,就可以使用这个指令,因为这意味着编译器报告的行号或文件名与文件中的行号或编译的文件名不匹配。#line指令可以用于恢复这种匹配。也可以使用语法#line default 把行号恢复默认行号。
5. #pragma
#pragma指令可以抑制或恢复指定的编译警告。#pragma指令可以在类或方法上执行,对抑制警告的内容和抑制的时间进行更精细的控制。
6. # region和#endregion
使用#region和#endregion指令,可以指定一块代码在视图中隐藏并使用易懂的文字标记来标识。#region和#endregion指令的使用能使较长的*.cs文件更便于管理。