1. 程式人生 > 實用技巧 >C# 前處理器指令

C# 前處理器指令

C#前處理器指令

前處理器指令指導編譯器在實際編譯開始之前對資訊進行預處理。

所有的前處理器指令都是以 # 開始。且在一行上,只有空白字元可以出現在前處理器指令之前。前處理器指令不是語句,所以它們不以分號(;)結束。

C# 編譯器沒有一個單獨的前處理器,但是,指令被處理時就像是有一個單獨的前處理器一樣。在 C# 中,前處理器指令用於在條件編譯中起作用。與 C 和 C++ 不同的是,它們不是用來建立巨集。一個前處理器指令必須是該行上的唯一指令。

C# 前處理器指令列表

下表列出了 C# 中可用的前處理器指令:

前處理器指令描述
#define 它用於定義一系列成為符號的字元。
#undef 它用於取消定義符號。
#if 它用於測試符號是否為真。
#else 它用於建立複合條件指令,與 #if 一起使用。
#elif 它用於建立複合條件指令。
#endif 指定一個條件指令的結束。
#line 它可以讓您修改編譯器的行數以及(可選地)輸出錯誤和警告的檔名。
#error 它允許從程式碼的指定位置生成一個錯誤。
#warning 它允許從程式碼的指定位置生成一級警告。
#region 它可以讓在使用 Visual Studio Code Editor 的大綱特性時,指定一個可展開或摺疊的程式碼塊。
#endregion 它標識著 #region 塊的結束。

#define 前處理器

#define 前處理器指令建立符號常量。

#define 允許定義一個符號,這樣,通過使用符號作為傳遞給 #if 指令的表示式,表示式將返回 true。它的語法如下:

#define symbol
 
#define isFinished
//預處理指令
using System;

...


 public static void run()
        {
            #if (isFinished)
            Console.WriteLine("isFinished:true");
            #else
global::System.Console.WriteLine("isFinished:false"); #endif Console.WriteLine("end if"); }

條件指令

可以使用 #if 指令來建立一個條件指令。條件指令用於測試符號是否為真。如果為真,編譯器會執行 #if 和下一個指令之間的程式碼。

條件指令的語法:

#if symbol [operator symbol]...

  

其中,symbol是要測試的符號名稱。也可以使用 true 和 false,或在符號前放置否定運算子。

常見運算子有:

  • == (等於)
  • != (不等於)
  • && (與)
  • || (或)

也可以用括號把符號和運算子進行分組。條件指令用於在除錯版本或編譯指定配置時編譯程式碼。一個以#if指令開始的條件指令,必須顯示地以一個#endif指令終止。

 public static void run()
        {
            #if (isFinished)
            Console.WriteLine("isFinished:true");
            #if (isFinished &&!SDK_LOLIPOP)
            global::System.Console.WriteLine("run in lolipop.");
            #endif
            Console.WriteLine("end if");

        }

其他前處理器指令:

#warning 和 #error:

當編譯器遇到它們時,會分別產生警告或錯誤。如果編譯器遇到 #warning 指令,會給使用者顯示 #warning 指令後面的文字,之後編譯繼續進行。如果編譯器遇到 #error 指令,就會給使用者顯示後面的文字,作為一條編譯錯誤訊息,然後會立即退出編譯。使用這兩條指令可以檢查 #define 語句是不是做錯了什麼事,使用 #warning 語句可以提醒自己執行某個操作。

#if DEBUG && RELEASE  
#error "You've defined DEBUG and RELEASE simultaneously!"  
#endif  
#warning "Don't forget to remove this line before the boss tests the code!"  
Console.WriteLine("*I hate this job.*");

2. #region 和 #endregion

#region 和 #endregion 指令用於把一段程式碼標記為有給定名稱的一個塊,如下所示:

#region Member Field Declarations
int x;
double d;
Currency balance;
#endregion

這看起來似乎沒有什麼用,它不影響編譯過程。這些指令的優點是它們可以被某些編輯器識別,包括 Visual Studio .NET 編輯器。這些編輯器可以使用這些指令使程式碼在螢幕上更好地佈局。

3. #line

#line 指令可以用於改變編譯器在警告和錯誤資訊中顯示的檔名和行號資訊,不常用。

如果編寫程式碼時,在把程式碼傳送給編譯器前,要使用某些軟體包改變輸入的程式碼,就可以使用這個指令,因為這意味著編譯器報告的行號或檔名與檔案中的行號或編輯的檔名不匹配。#line指令可以用於還原這種匹配。也可以使用語法#line default把行號還原為預設的行號:

#line 164 "Core.cs" // 在檔案的第 164 行
// Core.cs, before the intermediate
// package mangles it.
// later on
#line default // 恢復預設行號

4. #pragma

#pragma 指令可以抑制或還原指定的編譯警告。與命令列選項不同,#pragma 指令可以在類或方法級別執行,對抑制警告的內容和抑制的時間進行更精細的控制。如下:

#pragma warning disable 169    // 取消編號 169 的警告(欄位未使用的警告)
public class MyClass
{
    int neverUsedField;       // 編譯整個 MyClass 類時不會發出警告
}
#pragma warning restore 169   // 恢復編號 169 的警告