預處理指令提供按條件跳過源文件中的節、報告錯誤和警告條件,以及描繪源代碼的不同區域的能力。使用術語“預處理指令”只是為了與 C 和 C++ 編程語言保持一致。在 C# 中沒有單獨的預處理步驟;預處理指令按詞法分析階段的一部分處理。
下面是可用的預處理指令:
#define
和 #undef
,分別用于定義和取消定義條件編譯符號(第 2.5.3 節)。#if
、#elif
、#else
和 #endif
,用于按條件跳過源代碼中的節(第 2.5.4 節)。#line
,用于控制行號(在發布錯誤和警告信息時使用)(第 2.5.7 節)。#error
和 #warning
,分別用于發出錯誤和警告(第 2.5.5 節)。#region
和 #endregion
,用于顯式標記源代碼中的節(第 2.5.6 節)。預處理指令總是占用源代碼中的單獨一行,并且總是以 #
字符和預處理指令名稱開頭。#
字符的前面以及 #
字符與指令名稱之間可以出現空白符。
包含 #define
、#undef
、#if
、#elif
、#else
、#endif
或 #line
指令的源代碼行可以用單行注釋結束。在包含預處理指令的源行上不允許使用帶分隔符的注釋(/*
*/
樣式的注釋)。
預處理指令既不是標記,也不是 C# 句法文法的組成部分。但是,可以用預處理指令包含或排除標記序列,并且可以以這種方式影響 C# 程序的含義。例如,編譯后,程序:
#define A#undef Bclass C{#if A void F() {}#else void G() {}#endif#if B void H() {}#else void I() {}#endif}
產生與下面的程序完全相同的標記序列:
class C{ void F() {} void I() {}}
因此,盡管上述兩個程序在詞法分析中完全不同,但它們在句法分析中是相同的。