C#预处理指令的作用及理解
在程序调试和运行上有重要的作用。
- 比如预处理器指令可以禁止编译器编译代码的某一部分,如果计划发布两个版本的代码,即基本版本和有更多功能的企业版本,就可以使用这些预处理器指令来控制。
- 在编译软件的基本版本时,使用预处理器指令还可以禁止编译器编译于额外功能相关的代码。
- 另外,在编写提供调试信息的代码时,也可以使用预处理器指令进行控制。
总的来说和普通的控制语句(if等)功能类似,方便在于预处理器指令包含的未执行部分是不需要编译的。
#define和#undef
用法:
#define DEBUG
#undef DEBUG
#define
告诉编译器,我定义了一个DEBUG
的一个符号,他类似一个变量,但是它没有具体的值,可以将它看为一个符号而已。
#undef
就是删除这个符号的定义。如果符号DEBUG
没定义过,则#undef
不起作用,否则#define
不起作用。二者都必须放在源代码之前。
#if、#elif、#else、#endif
告诉编译器进行编译代码的流程控制。
#if DEBUG
Console.Write("debug");
#elif RELEASE
Console.Write("release");
#else
Console.Write("other");
#endif
以上代码就是说如果定义了DEBUG则输出debug,定义了RELEASE,则输出release,否则输出other。
#warning 和 #error:
当编译器遇到它们时,会分别产生警告或错误。如果编译器遇到 #warning 指令,会给用户显示 #warning 指令后面的文本,之后编译继续进行。如果编译器遇到 #error 指令,就会给用户显示后面的文本,作为一条编译错误消息,然后会立即退出编译。
使用这两条指令可以检查 #define 语句是不是做错了什么事,使用 #warning 语句可以提醒自己执行某个操作。
#if DEBUG && RELEASE
#error "You've defined DEBUG and RELEASE simultaneously!"
#endif
#warning "Don't forget to remove this line before the boss tests the code!"
Console.WriteLine("*I hate this job.*");
#region 和 #endregion
#region
和 #endregion
指令用于把一段代码标记为有给定名称的一个块,如下所示:
#region Member Field Declarations
int x;
double d;
Currency balance;
#endregion
这看起来似乎没有什么用,它不影响编译过程。这些指令的优点是它们可以被某些编辑器识别,包括 Visual Studio .NET 编辑器。这些编辑器可以使用这些指令使代码在屏幕上更好地布局。
#line
#line
指令可以用于改变编译器在警告和错误信息中显示的文件名和行号信息,不常用。
如果编写代码时,在把代码发送给编译器前,要使用某些软件包改变输入的代码,就可以使用这个指令,因为这意味着编译器报告的行号或文件名与文件中的行号或编辑的文件名不匹配。#line
指令可以用于还原这种匹配。也可以使用语法#line default
把行号还原为默认的行号:
#line 164 "Core.cs" // 在文件的第 164 行
// Core.cs, before the intermediate
// package mangles it.
// later on
#line default // 恢复默认行号
#pragma
#pragma
指令可以抑制或还原指定的编译警告。与命令行选项不同,#pragma
指令可以在类或方法级别执行,对抑制警告的内容和抑制的时间进行更精细的控制。如下:
#pragma warning disable 169 // 取消编号 169 的警告(字段未使用的警告)
public class MyClass
{
int neverUsedField; // 编译整个 MyClass 类时不会发出警告
}
#pragma warning restore 169 // 恢复编号 169 的警告