預處理指令提供按條件跳過源文件中的節、報告錯誤和警告條件,以及描繪源代碼的不同區域的能力。使用術語“預處理指令”只是為了與 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 B
class C
{
#if A
void F() {}
#else
void G() {}
#endif
#if B
void H() {}
#else
void I() {}
#endif
}
產生與下面的程序完全相同的標記序列:
class C
{
void F() {}
void I() {}
}
因此,盡管上述兩個程序在詞法分析中完全不同,但它們在句法分析中是相同的。