預處理指令提供按條件跳過源文件中的節、報告錯誤和警告條件,以及描繪源代碼的不同區域的能力。使用術語“預處理指令”只是為了與 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() {} }
因此,盡管上述兩個程序在詞法分析中完全不同,但它們在句法分析中是相同的。