預(yù)處理器指令 用于指示編譯器如何對(duì)待處理源代碼。
通用規(guī)則
預(yù)處理器指令的某些最重要的句法規(guī)則如下:
- 預(yù)處理器指令與 C# 代碼必須分處不同的行唉地。
- 預(yù)處理指定不通過(guò)分號(hào)終止据悔。
- 每一行的預(yù)處理器指令以
#
字符開(kāi)始。-
#
字符前可以有空白耘沼。 -
#
字符和指令之間可以有空白极颓。
-
- 允許 end-of-line 注釋
//
。 - 不允許使用 delimited 注釋
/* ... */
群嗤。
#define
和 undef
指令
一種編譯符號(hào)(compilation symbol)菠隆,并且僅有兩種狀態(tài),已定義(defined)或未定義(undefined)狂秘,它具有以下的特征:
- 標(biāo)識(shí)符可以為任意值骇径,但
true
和false
除外。 - 它沒(méi)有值者春。
#define
指令用于聲明一個(gè)編譯符號(hào)破衔,#undef
指令用于取消一個(gè)編譯符號(hào)的定義。
#define PremiumVersion
#define EconomyVersion
...
#undef PremiumVersion
#define
和 #undef
指令只能在源文件頂部使用钱烟,也就是 C# 代碼之前晰筛。編譯符號(hào)的作用于僅限于一個(gè)單一的源文件中。
條件編譯指令
條件編譯指令可以允許您根據(jù)某些特定的編譯符號(hào)來(lái)決定哪些代碼塊需要編譯以及哪些需要跳過(guò)拴袭。條件編譯指令有四種:
#if
#else
#elif
#endif
指令后面的條件也就是返回 true
或者 false
的簡(jiǎn)單表達(dá)式读第。
- 條件可以是由一個(gè)編譯符號(hào)或一個(gè)編譯符號(hào)和運(yùn)算符組成的表達(dá)式。子表達(dá)式可以使用圓括號(hào)進(jìn)行分組拥刻。
-
true
和false
字面量同樣可以用于條件表達(dá)式怜瞒。
參數(shù)類型 | 含義 | 值 |
---|---|---|
編譯符號(hào) | 使用 #define 定義的標(biāo)識(shí)符 |
True:如果這個(gè)符號(hào)已使用 #define 定義 False:與上相反 |
表達(dá)式 | 編譯符號(hào)和 ! , == , != , && , || 組成 |
True:表達(dá)式的值為 true False:與上相反 |
診斷指令
診斷指令用于生成用戶自定義的編譯時(shí)警告和錯(cuò)誤消息。下面的就是診斷指令的句法泰佳,其中 Message 是字符串盼砍,但是需要注意的是,它和 C# 中的字符串不一樣逝她,它不需要使用引號(hào)括起來(lái)浇坐。
#warning Message
#error Message
當(dāng)編譯器遇到一個(gè)診斷指令的時(shí)候,它就會(huì)將與指令關(guān)聯(lián)的消息輸出黔宛。診斷指令消息將與編譯器生成的任何警告和錯(cuò)誤消息一同列出近刘。
舉個(gè)例子,下面的代碼展示了 #error
和 #warning
指令的使用臀晃。
-
#if
結(jié)構(gòu)中有一個(gè)#error
指令觉渴,如果#if
指令的條件滿足,那么#error
指令中的消息將會(huì)生成徽惋。 -
#warning
指令用于提醒程序員后期記得清理某個(gè)部分的代碼案淋。
#define RightHanded
#define LeftHanded
#if RightHanded && LeftHanded
#error Can't build for both RightHanded and LeftHanded
#endif
#warning Remember to come back and clean up this code!
行號(hào)指令
行號(hào)指令可以做以下幾件事:
- 變更編譯器警告和錯(cuò)誤消息的顯式行號(hào)。
- 變更被編譯的源文件的顯式文件名险绘。
- 從交互式調(diào)試器中隱藏一序列行踢京。
#line
指令的句法如下:
#line integer // 將下一行行號(hào)設(shè)置為指定的整形值
#line "filename" // 設(shè)置顯式的文件名誉碴,雙引號(hào)是必須的
#line default // 恢復(fù)真實(shí)的行號(hào)和文件名
#line hidden // 在分步調(diào)試器中隱藏下面的代碼
#line // 在調(diào)試器中停止隱藏
#line 226
x = y + z; // 編譯器現(xiàn)在所認(rèn)為的行號(hào)為 226
...
#line 330 "SourceFile.cs" // 變更報(bào)告的行號(hào)和文件名
var1 = var2 + var3;
#line default // 恢復(fù)行號(hào)和文件名
區(qū)域指令
#region
可以允許您在一段代碼上標(biāo)注可選的名稱,它由 #region
和 endregion
指令組成瓣距,特性如下:
-
#region
指令放置在您想要標(biāo)準(zhǔn)的代碼區(qū)域上部黔帕,#endregion
放置在代碼區(qū)域的最后一行。 -
#region
只能可以接受可選的文本字符串蹈丸,可將其作為區(qū)域的名稱成黄。 - 區(qū)域當(dāng)中可以嵌套區(qū)域。
- 區(qū)域嵌套的層級(jí)不限逻杖。
-
#endregion
指令永遠(yuǎn)都是匹配它上面的第一個(gè)未匹配到的#region
指令奋岁。
雖然編譯器是直接忽略區(qū)域指令的,但是弧腥,它可以供源碼工具厦取,比如 Visual Studio 使用,用于隱藏或展示某個(gè)代碼片段管搪。
#pragma warning
指令
#pragma warning
指令允許您關(guān)閉或開(kāi)啟警告消息虾攻。
- 想要關(guān)閉警告消息,使用
disable
并在后面加上逗號(hào)隔開(kāi)的警告數(shù)字列表更鲁。 - 想要恢復(fù)警告消息霎箍,使用
restore
并在后面加上逗號(hào)隔開(kāi)的警告數(shù)字列表。
舉個(gè)例子澡为,下面的代碼關(guān)閉了兩個(gè)警告消息:618 和 414漂坏。后面,又開(kāi)啟了 618媒至,但是 414 仍處于關(guān)閉狀態(tài):
#pragma warning disable 618, 414
...
#pragma warning restore 618
如果沒(méi)有使用任何警告數(shù)字列表顶别,那么這個(gè)命令將應(yīng)用在所有的警告之上。舉個(gè)例子拒啰,下面的代碼關(guān)閉了所有的警告驯绎,并在后面又恢復(fù)了所有的警告:
#pragma warning disable
...
#pragma warning restore