C# 預(yù)處理器指令

預(yù)處理器指令 用于指示編譯器如何對(duì)待處理源代碼。

通用規(guī)則

預(yù)處理器指令的某些最重要的句法規(guī)則如下:

  • 預(yù)處理器指令與 C# 代碼必須分處不同的行唉地。
  • 預(yù)處理指定不通過(guò)分號(hào)終止据悔。
  • 每一行的預(yù)處理器指令以 # 字符開(kāi)始。
    • # 字符前可以有空白耘沼。
    • # 字符和指令之間可以有空白极颓。
  • 允許 end-of-line 注釋 //
  • 不允許使用 delimited 注釋 /* ... */群嗤。

#defineundef 指令

一種編譯符號(hào)(compilation symbol)菠隆,并且僅有兩種狀態(tài),已定義(defined)或未定義(undefined)狂秘,它具有以下的特征:

  • 標(biāo)識(shí)符可以為任意值骇径,但 truefalse 除外。
  • 它沒(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)行分組拥刻。
  • truefalse 字面量同樣可以用于條件表達(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)注可選的名稱,它由 #regionendregion 指令組成瓣距,特性如下:

  • #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

參考資料

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谋旦,隨后出現(xiàn)的幾起案子剩失,更是在濱河造成了極大的恐慌,老刑警劉巖册着,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拴孤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡甲捏,警方通過(guò)查閱死者的電腦和手機(jī)演熟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)司顿,“玉大人绽媒,你說(shuō)我怎么就攤上這事蚕冬。” “怎么了是辕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)猎提。 經(jīng)常有香客問(wèn)我获三,道長(zhǎng),這世上最難降的妖魔是什么锨苏? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任疙教,我火速辦了婚禮,結(jié)果婚禮上伞租,老公的妹妹穿的比我還像新娘贞谓。我一直安慰自己,他們只是感情好葵诈,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布裸弦。 她就那樣靜靜地躺著,像睡著了一般作喘。 火紅的嫁衣襯著肌膚如雪理疙。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,370評(píng)論 1 302
  • 那天泞坦,我揣著相機(jī)與錄音窖贤,去河邊找鬼。 笑死贰锁,一個(gè)胖子當(dāng)著我的面吹牛赃梧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播豌熄,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼授嘀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了房轿?” 一聲冷哼從身側(cè)響起粤攒,我...
    開(kāi)封第一講書(shū)人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎囱持,沒(méi)想到半個(gè)月后夯接,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纷妆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年盔几,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掩幢。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡逊拍,死狀恐怖上鞠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芯丧,我是刑警寧澤芍阎,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站缨恒,受9級(jí)特大地震影響谴咸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骗露,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一岭佳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧萧锉,春花似錦珊随、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至优俘,卻和暖如春京办,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背帆焕。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工惭婿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叶雹。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓财饥,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親折晦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子钥星,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容