標籤:
本文轉載自:http://www.cnblogs.com/miffylf/p/4005223.html
C#有許多名為前置處理器指令的命令。這些命令從來不會轉化為可執行代碼中的命令,但會影響編譯過程的各個方面。
例如,使用前置處理器指令可以禁止編譯器編譯代碼的某工部分。如果計劃發布兩個版本的代碼,即基本版本和擁有更多功能的企業版本,
就可以使用這些前置處理器指令。在編譯軟體的基本版本時,使用前置處理器指令可以禁止編譯器編譯
與額外功能相關的代碼。另外,在編寫提供調試資訊的代碼時,也可以使用前置處理器指令。
#define和#undef
#define的用法如下所示:
#define DEBUG
它告訴編譯器存在給定名稱的符號,在本例中是DEBUG。這有點類似於聲明一個變數,但這
個變數並沒有真正的值,只是存在而己。這個符號不是實際代碼的一部分,而只在編譯器編譯代碼
時存在。在C#代碼中它沒有任何意義。
#undef正好相反——它刪除符號的定義:
#undef DEBUG
如果符號不存在,#undef就沒有任何作用。同樣,如果符號已經存在,則#define也不起作用。
必須把#define和#undef命令放在C#源檔案的開頭位置,在聲明要編譯的任何對象的代碼之前。
#define本身並沒有什麼用,但與其他前置處理器指令(特別是(#if)) 結合使用時,它的功能就非常強
大了。
#if,#elif,#else和#endif
這些指令告訴編譯器是否要編譯某個代碼塊。考慮下面的方法:
int DosomeWork(double x)
{
// do something
#if DEBuG
Console.WriteLine("x is " + x)`
#endif
}
這段代碼會像往常那樣編譯,但Console .WriteLin()命令包含在#if子句內。這行代碼只有在前面
的#define命令定義了符號DEBUG後才執行。當編譯器遇到#if後,將先檢查相關的符號是否存在,如果符號存在,就編譯#if子句中的代碼。否則,編譯器會忽略所有的代碼,直到遇到匹配的#endif指令為止。一般是在調試時定義符號DEBUG,把與調試相關的代碼放在#if子句中。在完成了調試後,就把#define語句注釋掉,所有的調試代碼會奇蹟般地消失,可執行檔也會變小,終端使用者不會被這些調試資訊弄糊塗(顯然,要做更多的測試,確保代碼在沒有定義DEBUG的情況下也能工作。這項技術在C和C++編程中十分常見,稱為條件編譯(conditional compilation)#elif(= else if)和#else指令可以用在#if塊中,其含義非常直觀。也可以嵌套#if塊:
#define ENTERPRIsE
#define W2K
// further on in the file
#if ENTERPRISE
// do something
#if W2K
// some code that is only relevant to enterprise
// edition running on W2K
#endif
#elif PROFESSIONAL
// do something else
#else
// code for the leaner version
#endif
#warning和#error
另兩個非常有用的前置處理器指令是#warning和#error,當編譯器遇到它們時,會分別產生警告或
錯誤。如果編譯器遇到#warning指令,會給使用者顯示#warning指令後面的文本,之後編譯繼續進行。
如果編譯器遇到#error指令,就會給使用者顯示後面的文本,作為一條編譯錯誤訊息,然後會立即退
出編譯,不會產生IL代碼。
#region 和#endregion
#region 和#endregion指令用於把一段代碼標記為有給定名稱的一個塊。
#line
#line指令可以用於改變編譯器在警告和錯誤資訊中顯示的檔案名稱和行號資訊。這條指令用得並
不多。如果編寫代碼時,在把代碼發送給編譯器前,要使用某些軟體包改變輸入的代碼,就可以使
用這個指令,因為這意味著編譯器報告的行號或檔案名稱與檔案中的行號或編輯的檔案名稱不匹配。
#program
#program指令可以抑制或還原制定的編譯警告。於命令列選項不同,#program指令可以在類或方法層級執行,對抑制警告的內容和抑制更精細的控制。
C#前置處理器指令【轉】