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 } }