“預處理器指令”這些命令從來不會轉化爲可執行代碼的命令,但會影響編譯過程的各個方面。例如,使用預處理器指令可以禁止編譯代碼的某一部分。如果計劃發佈兩個版本的代碼,即基本版本和擁有更多功能的企業版本,就可以使用這些預處理器命令。在編譯軟件的基本版本時,使用預處理器指令可以禁止編譯器編譯與額外功能相關的代碼。另外,在編寫提供調試信息的代碼時,使用預處理指令可以禁止編譯器編譯與額外功能相關的代碼。另外,在編寫提供調試信息的代碼時,也可以使用預處理指令。實際上,在銷售軟件時,一般不希望編譯這部分代碼。
- #define和undef#defing用法: #define DebugDebug可以看做是聲明一個變量,但此變量沒有真正的值,只是存在而已。#define單獨用沒什麼意義,一般是和#if結合使用。
- #define用法: #undef Debug作用就是刪除Debug的定義。如果Debug符號不存在,這條指令就沒有任何作用。如果Debug符號存在,則之前的#define Debug則無效。#define與#undef申明必須放在C#源文件的開頭位置,即程序集引用的開頭。以下是一個示例:
#define DEBUG1 #define DEBUG2 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { #if DEBUG1 MessageBox.Show("Debug version1"); #elif DEBUG2 MessageBox.Show("Debug version2"); #else MessageBox.Show("Debug version3"); #endif #if DEBUG2 MessageBox.Show("Debug version2"); #endif } } }
執行結果:注意:這裏需要注意的地方就是對於if語句,從上到下執行,在執行的過程中如果有一個條件滿足將終止整個if語句。這與Switch....case語句不同,只要條件滿足就可以執行。#elif(=else if)與其含義相同。這裏Debug只是一個名稱,不是關鍵字。 - #warning和#error當編譯器遇到這兩條指令時,會分別產生警告和錯誤。如果編譯器遇到#warning指令,會顯示該指令後的文本,之後繼續編譯。如果遇見#error指令,也會顯示指令後面的文本,但會立刻退出編譯,不會產生IL代碼。(其實和編譯器的警告和錯誤意義相同)以下是一個示例:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { #warning "ALL RIGHT?" { MessageBox.Show("Debug version1"); } #error "ALL RIGHT?" MessageBox.Show("Debug version1"); } } }
注意:當代碼編譯的過程中遇到error指令時,是無法編譯的。 - #region和#endregion將代碼進行收縮。
- #line使您可以修改編譯器的行號以及(可選)錯誤和警告的文件名輸出。其實功能類似於更改行號。
class MainClass { static void Main() { #line 200 "Special" int i; // CS0168 on line 200 int j; // CS0168 on line 201 #line default char c; // CS0168 on line 9 float f; // CS0168 on line 10 #line hidden // numbering not affected string s; double d; // CS0168 on line 13 } }
- #pragma爲編譯器提供特殊的指令,以說明如何編譯包含帶有雜注的文件,這些指令必須是編譯器支持的指令。也就是說,不能使用#pragma創建自定義預處理指令。有以下兩個指令。(1)#pragma warning 可禁用或啓用某些警告。語法如下:#pragma
warning disable warning-list#pragma warning restore warning-list以下爲示例:
注意:當沒有指定警告編號時,disable禁用所有警告,而restore啓用所有警告。// pragma_warning.cs 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() { } }
(2)#pargma checksum語法:#pragma checksum "filename" "{guid}" "check bytes"參數“filename”要求監視更改或更新新的文件名稱。參數“{guid}”文件的全局唯一標識符(GUID)。參數“checksum_byte”十六進制數的字符串,表示校驗和的字節。必須是偶數位的十六進制數。奇數編譯會導致編譯警告,發生錯誤。注意:目前不適合ASP.NET項目class TestClass { static int Main() { #pragma checksum "file.cs" "{3673e4ca-6098-4ec1-890f-8fceb2a794a2}" "{012345678AB}" // New checksum } }