C#有許多名為預處理器指令的命令。這些命令從來不會被翻譯為可執行代碼中的命令,但會影響編譯過程的各個方面。例如,預處理器可禁止編譯器編譯代碼的某一部分。如果計劃發布兩個版本的代碼,比如基本版本和企業版本,或者針對不同的.NET Framework版本進行編碼,就可以使用這些指令。在Anthem.NET的代碼中我們經常可以看到這種用法。
預處理器指令的開頭都有符號#。
注意:
C#中並沒有一個像C++那樣的獨立預處理器,所謂的預處理器指令仍由編譯器處理。
下面將對這些指令逐一介紹。
1. #define和#undef
#define可以定義符號。當將符號用作傳遞給#if指令的表達式時,此表達式的計算結果true。如
#define DEBUG
它告訴編譯器存在給定名稱的符號,在本例中是DEBUG。這個符號不是實際代碼的一部分,只在編譯代碼時存在。
#undef正好相反,它刪除一個符號。
必須把#define和#undef命令放在C#源碼的開頭,即在要編譯的任何代碼之前。它不像C++中那樣可以定義常數值。
#define本身並無大用,它需要配合#if指令使用。
如
#define DEBUG
int DoSw(double x)
{
#if DEBUG
COnsole.WriteLine("x is"+X);
#edif
}
2. #if, #elif, #else和#endif
這些指令告訴編譯器是否要編譯某個代碼塊。看下面的方法:
static void PrintVersion()
{
#if V3
Console.WriteLine("Version 3.0");
#elif V2
Console.WriteLine("Version 2.0");
#else
Console.WriteLine("Version 1.0");
#endif
}
上面的代碼會根據定義的符號來打印不同的版本信息。 這種方式成為條件編譯。
注意:
使用#if不是條件編譯代碼的唯一方式,C#還提供了通過Conditional屬性的機制。
#if和#elif還支持一組邏輯運算符!=,==,!=和|| 。如果符號存在,符號的值被認為是true,否則為false,如:
#if V3 || (V2 == true) // if 定義了V3或V2符號...
3. #warning和#error
這也是兩個很有用的預處理器指令,編譯器遇到它們時,會分別產生警告或錯誤信息。如果遇到#warning指令,會向用戶顯示#warning指令後面的文本。實際上,在VS2005中,IDE會直接將信息標識出來:
而如果編譯器遇到#error,就會立即退出編譯,不會產生IL代碼。
使用這兩個指令可以檢查#define是不示做錯了什麼事,使用#warning可以讓自己想起做什麼事。
#if DEBUG && RELEASE
#error "You 've define xxxx!"
#ednif
#warning "Don't forgot to removexxxxxx!"
Console.WriteLine("I have this job");
4. #region和#endregion
#region和#endregion指令用於把一段代碼標記為有指定名稱的一個塊,如下所示:
#region private methods
private int x;
private int y;
#endregion
這兩個指令不會影響編譯過程。但可以為VS編輯器所識別,從而使得代碼顯示布局更為清晰。
5. #line
可以用於改變編譯器在警告和錯誤信息中顯示的文件的名字和行號信息。如果編寫代碼時,在把代碼發給比編譯器前,要使用某些軟件包改變鍵入的代碼,玖可以使用者個指令,因為這意味著比編譯器的報告的行號或文件名與文件中的行號或編譯的文件名不匹配。#line指令可以用於恢復這種匹配也可以使用語法#line default 把行號恢復默認。
#line 164 "cORE.CS"
#LINE default
6. #pragma,#pragma warning,#pragma checksum
#pragma:為編譯器提供特殊的指令,說明如何編譯包含雜注的文件。
#pragma warning:可啟用或禁用某些警告。
#pragma checksum:生成源文件的校驗和,以幫助調試ASP.NET頁。
可以抑制或恢復指定的編譯警告。與命令行選項不同,#pragma指令可以在類和方法上執行,對抑制什麼警告和抑制的時間進行更精細的控制。
#pragma warning disable 169
public class Aclass
{
int nFiled;
}
#pragma warning restore 169
這些預處理指令詳見MSDN:
#if
#else
#elif
#endif
# define
#undef
#warning
#error
#line
#region
#endregion
#pragma
#pragma warning
#pragma checksum