雖然同C和C++的術語“預處理指令”名稱1樣,但C#的其實并沒有單獨的預處理步驟,也就是說在VS等環境中并沒有預處理的編譯器。
預處理指令能夠用于替換源文件中的信息。以#(Sharp)字符和預處理指令名稱開頭。例如:
#define MAX
習慣于將預處理指令的名稱全部設為大寫。和C與C++不同的是,C#中的預處理指令的名稱后不加數字等。CC++所支持的宏函數在C#中也是不支持的。
還可使用#region來設置1個區域,同時也能夠通過Visual Studio讓代碼折疊。常常在#region后加上該區域的名稱的字符串,可以實現注釋的作用。
#region C#預處理指令
#endregion
1.#undef
上面我們使用了#define,其實還是有#undef的。那末它又是做甚么的呢?
#define MAX
static void Main(string[] args)
{
#if (MAX)
Console.WriteLine("MAX已定義了。");
#endif
}
如果我們Debug程序,就會在控制臺看到這樣1條:
MAX已定義了。
如果我們Release程序,得到的結果也還是1樣的,但是如果在代碼開頭加上:
#undef MAX
再來Debug控制臺就不會有消息提示了。
2.#if、#else、#elif
如果想要控制臺顯示MAX沒有定義的情況,那就用#else來搭配#if就能夠了。
#if (MAX)
Console.WriteLine("MAX已定義了。");
#else
Console.WriteLine("MAX還沒有定義。");
#endif
也許你在鍵入#else的時候也看到了#elif,這個自然就是對應的else if了。它們的邏輯和常規的if套裝是1樣的。
#define MAX
#undef MAX
#define MIN
static void Main(string[] args)
{
#if (MAX)
Console.WriteLine("MAX已定義了。");
#elif (MIN)
Console.WriteLine("MIN已定義了。");
#else
Console.WriteLine("MAX還沒有定義。");
#endif
Console.ReadLine();
}
3.#warning、#error
這兩個預處理指令用于拋出異常和毛病。
#warning 這是1個強迫拋出的異常。
#error 這是1個強迫拋出的毛病。
4.#line
我們還可以用#line將以下#error這行代碼的行數設置為10000行,并將文件名設置為”毛病“。
static void Main(string[] args)
{
#line 10000 "毛病"
#error 這是1個強迫拋出的毛病。
}
如果我們再添加這樣1行代碼,則會將行數和文件名恢復為默許的。
#line 10000 "Error"
#error 這是1個強迫拋出的毛病。
#line default
#warning 這是1個強迫拋出的正告。
5.#pragma
我們先在Program類前加上這樣1行代碼,它會引發CS3021毛病。
[CLSCompliant(false)]
然后我們在上面這行代碼前加入以下這行代碼,其作用是禁用warning 3021。那末再次Debug就會發現本來的毛病已不在了。
#pragma warning disable 3021
如果想要在后文中恢復這個CS3021毛病,就用restore便可。
#pragma warning restore 3021
以下是完全代碼。
#pragma warning disable 3021
[CLSCompliant(false)]
class Program
{
static void Main(string[] args)
{}
}
#pragma warning restore 3021
[CLSCompliant(false)]
public class OtherProgram
{
public static void OtherMain()
{}
}
這個預處理指令實際上是非常復雜的,在各大百科上已有了相干介紹,以下是維基百科上的。傳送門:pragma once。