C#的预处理器指令很容易识别,你看到了#,就能认出它们。
它和其他的命令有什么区别呢?
区别在于这些命令从来不会转化为可执行代码的命令,但是会影响编译过程的各个方面。
它用来做什么呢?
当计划发布两个版本的代码的时候。即基本版和拥有更多版本的企业版,就可以用到预处理器指令。
在编译基本版的时候,使用预处理指令会禁止编译器编译与额外功能相关的代码。
另外,在编写提供调试信息的代码时,也可以使用预处理器指令。
下面介绍预处理器指令的功能:
#define和#undef
#define用法: #define Debug
Debug可以看做是声明的一个变量,但此变量没有真正的值,仅存在。
#define单独用没什么意义,一般是和#if结合使用。
#undef用法: #undef Debug
作用就是删除Debug的定义。如果Debug符号不存在,这条指令就没有任何作用。如果Debug符号存在,则之前的#define就没有作用。
#define与#undef声明必须放在C#源文件的开头位置,即程序集的引用的上方。
#if,#elif,#else和#endif
下面来看一个例子
//#define DebugA #define DebugB using System; namespace MyApplication { class Program { static void Main(string[] args) { #if DebugA Console.WriteLine("Hello DebugA"); #elif DebugB Console.WriteLine("Hello DebugB"); #else Console.WriteLine("Hello Debugelse"); #endif } } }
#elif(=else if)和#else指令可以用在#if中,和C#中的if,else if,else含义相同。
#if和#elif支持一组逻辑运算符"!","==","!="和"||",如果符号存在,则为true。
#if DebugB && DebugA //当Debug与DebugA同时存在才会执行
#warning和#error
当编译器遇到这两条指令时,会分别产生警告和错误。如果编译器遇到#warning指令,会显示该指令后的文本,之后继续编译。
如果遇见#error指令,也会显示指令后面的文本。但会立刻退出编译,不会产生IL代码。(其实和编译器的警告和错误意义相同)
static void Main(string[] args) { #warning "All Right?" Console.WriteLine("Contine..."); //#error "All Right?" // Console.WriteLine("Contine..."); }
下图为放开#error注释:
#region和#endregion
这两条指令,大家应该非常熟悉,作用就是代码缩进和指定该代码块的名称,使得代码可以更好的布局。详细用法可以参照报表系列的代码。
#line
这条指令很少用到。作用就是:如果代码在编译之前,要使用某些软件包改变输入的代码,就可以使用它。
(其实就是更改代码的行号)
#pragma warning
此指令可启用或禁用某些警告。
用法: #pragma warning disable warning-list
#pragma warning restore warning-list
例子:
using System; #pragma warning disable 414, 3021 [CLSCompliant(false)] public class C { int i = 1; static void Main() { } } #pragma warning restore 3021 [CLSCompliant(false)] // CS3021 public class D { int i = 1; public static void F() { } }
#pragma checksum
作用是生成源文件的校验和,以帮助调试 ASP.NET 页。
用法: #pragma checksum "filename" "{guid}" "checksum bytes"
filename" 要求监视更改或更新的文件的名称。
"{guid}" 文件的全局唯一标识符 (GUID)。
"checksum_bytes" 十六进制数的字符串,表示校验和的字节。必须是偶数位的十六进制数。
奇数位的十六进制数字会导致编译时警告,然后指令被忽略。
例子:
class TestClass { static int Main() { #pragma checksum "file.cs" "{3673e4ca-6098-4ec1-890f-8fceb2a794a2}" "{012345678AB}" // New checksum } }