C#?預(yù)處理器指令的用法

      快訊 來源:腳本之家 2023-07-07 15:57:56

      目錄
      1,預(yù)處理器指令的概念2,預(yù)處理器指令的定義與使用2.1,可為空上下文2.2,定義符號2.3,條件編譯2.4,定義區(qū)域2.5,錯誤和警告信息2.6,雜注3,預(yù)處理器指令的用途結(jié)語

      1,預(yù)處理器指令的概念

      預(yù)處理器指令是指編譯器在實際編譯開始之前對信息進行預(yù)處理。通常用于簡化源程序在不同的執(zhí)行環(huán)境中的更改和編譯。例如可以替換文本中的標(biāo)記,將其他內(nèi)容插入源文件,或者通過移除幾個部分的文本來取消一部分文件的編譯。不同于 C 和 C++ 中的指令,在 C# 中不能使用這些指令來創(chuàng)建宏,而且預(yù)處理器指令必須是一行中唯一的代碼,不能摻雜其它。

      示例如下:

      #define condition       // 定義 condition 字符
      using System;
      
      public class ExampleProgram
      {
          static void Main(string[] args)
          {
              #if (condition)         // 測試 condition 是否為真
                  Console.WriteLine("condition is defined");
              #else
                  Console.WriteLine("condition is not defined");
              #endif
                  Console.ReadLine(); 
          }
      }
      

      2,預(yù)處理器指令的定義與使用

      在 C# 程序中,所有的預(yù)處理器指令都是以標(biāo)識符 # 開始,例如 #define 和 #if,并且預(yù)處理器指令之前只能出現(xiàn)空格不能出現(xiàn)任何代碼。另外,預(yù)處理器指令不是語句,因此它們不需要以分號;結(jié)尾。


      【資料圖】

      2.1,可為空上下文

      #nullable 預(yù)處理器指令用于設(shè)置可為空注釋上下文和為空警告上下文。#nullable 指令控制著是否可為空注釋是否有效,以及是否給出為 Null 的警告。設(shè)置著每個上下文要么處于已禁用狀態(tài),要么處于已啟用狀態(tài) 。

      下表列出 #nullable 指令的用法:

      用法描述
      #nullable disable將可為空注釋和警告上下文設(shè)置為“已禁用”。
      #nullable enable將可為空注釋和警告上下文設(shè)置為“已啟用”。
      #nullable restore將可為空注釋和警告上下文還原為項目設(shè)置。
      #nullable disable annotations將可為空注釋上下文設(shè)置為“已禁用”。
      #nullable enable annotations將可為空注釋上下文設(shè)置為“已啟用”。
      #nullable restore annotations將可為空注釋上下文還原為項目設(shè)置。
      #nullable disable warnings將可為空警告上下文設(shè)置為“已禁用”。
      #nullable enable warnings將可為空警告上下文設(shè)置為“已啟用”。
      #nullable restore warnings將可為空警告上下文還原為項目設(shè)置。

      代碼示例:

      using System;
      
      public class ExampleProgram
      {
          static void Main(string[] args)
          {
              string? str;
      
          #nullable disable       // 將可為空注釋和警告上下文設(shè)置為“已禁用”。 
              Console.WriteLine(str);         // 報錯: 使用了未賦值的局部變量“str”
      
          #nullable enable        // 將可為空注釋和警告上下文設(shè)置為“已啟用”。 
              Console.WriteLine(str);
          }
      }
      

      代碼界面:(PS:筆者使用的代碼編輯器是 Visual Studio 2022)

      2.2,定義符號

      可以使用定義符號 #define 和 取消定義符號 #undef 兩個預(yù)處理器指令來定義或取消定義條件編譯的符號。定義符號可用于 #if 等編譯指令的條件,使用 #define 來定義符號,將符號用作傳遞給 #if 指令的表達式。

      代碼示例:

      #define VERBOSE     // 定義符 #define
      using System;
      
      public class ExampleProgram
      {
          static void Main(string[] args)
          {
              #if VERBOSE
                      Console.WriteLine("詳細輸出版本");
              #endif
          }
      }
      

      代碼執(zhí)行結(jié)果:

      詳細輸出版本

      2.3,條件編譯

      可以使用以下四個預(yù)處理器指令來控制條件編譯:

      #if:打開條件編譯,其中僅在定義了指定的符號時才會編譯代碼。#elif:關(guān)閉前面的條件編譯,并基于是否定義了指定的符號打開一個新的條件編譯。#else:關(guān)閉前面的條件編譯,如果沒有定義前面指定的符號,打開一個新的條件編譯。#endif:關(guān)閉前面的條件編譯。

      代碼示例:

      #define condition2       // 定義 condition 字符
      using System;
      
      public class ExampleProgram
      {
          static void Main(string[] args)
          {
              #if (condition)
                  Console.WriteLine("condition is defined");
              #elif (condition2)      // 測試 condition2 是否為真 
                  Console.WriteLine("condition2 is defined");
              #else
                  Console.WriteLine("condition is not defined");
              #endif
                  Console.ReadLine();
          }
      }
      

      代碼執(zhí)行結(jié)果:

      csharp condition2 is defined

      補充:

      #if 以及 #else、#elif、#endif、#define 和 #undef 指令,允許在這些指令之間存在一個或多個符號里面包括或排除代碼。其中,#if 指令開頭的條件指令必須以 #endif 指令顯式終止。可以使用#define 指令你定義一個符號,通過將該符號用作傳遞給 #if 指令的表達式。條件編譯指令的用法和 C# 中的條件判斷語句 if、elif 和 else 語句差不多。

      2.4,定義區(qū)域

      可以使用定義區(qū)域符號 #region 和 #endregion 分別表示啟動區(qū)域和結(jié)束區(qū)域。這兩個預(yù)處理器指令來定義可在大綱中折疊的代碼區(qū)域。利用 #region 和 #endregion 指令,可以指定在使用代碼編輯器的大綱功能時可展開或折疊的代碼塊。#region 指令后面可跟折疊區(qū)域的名稱。在較長的代碼文件中,折疊或隱藏一個或多個代碼區(qū)域十分方便。

      代碼示例:

      using System;
      
      #region MyClass definition
      public class ExampleProgram
      {
          static void Main(string[] args)
          {
          }
      }
      #endregion
      

      折疊前:

      折疊后:

      2.5,錯誤和警告信息

      可以使用錯誤和警告信息指令告訴編譯器生成用戶定義的編譯器錯誤和警告,并控制行信息。其中包括 #error、#warning 和 #line 指令。

      #error:使用指定的消息生成編譯器錯誤。

      示例如下:

      using System;
      
      public class ExampleProgram
      {
          static void Main(string[] args)
          {
              // 錯誤:此方法中的棄用代碼。
              #error Deprecated code in this method.      
              Console.WriteLine("This is Deprecated code");
          }
      }
      

      代碼界面:

      #warning:使用指定的消息生成編譯器警告。

      示例如下:

      using System;
      
      public class ExampleProgram
      {
          static void Main(string[] args)
          {
              // 警告:此方法中的棄用代碼。
              #warning Deprecated code in this method.
              Console.WriteLine("This is Deprecated code");
          }
      }
      

      代碼界面:

      #line:更改用編譯器消息輸出的行號。

      示例如下:

      using System;
      
      public class ExampleProgram
      {
          static void Main()
          {
      #line 200 "Special"
              int i;
              int j;
      #line default       
              char c;
              float f;
      #line hidden        // 編號不受影響
              string s;
              double d;
          }
      }
      

      編譯產(chǎn)生以下輸出:

      Special(200,13): warning CS0168: The variable ‘i’ is declared but never used
      Special(201,13): warning CS0168: The variable ‘j’ is declared but never used
      MainClass.cs(9,14): warning CS0168: The variable ‘c’ is declared but never used
      MainClass.cs(10,15): warning CS0168: The variable ‘f’ is declared but never used
      MainClass.cs(12,16): warning CS0168: The variable ‘s’ is declared but never used
      MainClass.cs(13,16): warning CS0168: The variable ‘d’ is declared but never used

      #line 200 指令將下一行的行號強制設(shè)為 200(盡管默認值為 #6);在執(zhí)行下一個 #line 指令前,文件名都會報告為“特殊”。#line default 指令將行號恢復(fù)至默認行號,這會對上一指令重新編號的行進行計數(shù)。#line hidden 指令能對調(diào)試程序隱藏連續(xù)行,當(dāng)開發(fā)者逐行執(zhí)行代碼時,介于 #line hidden 和下一 #line 指令(假設(shè)它不是其他 #line hidden 指令)間的任何行都將被跳過。

      2.6,雜注

      #pragma 為編譯器給出特殊指令以編譯它所在的文件,這些指令必須受編譯器支持。換句話說,不能使用 #pragma 創(chuàng)建自定義的預(yù)處理指令。

      #pragma 指令的語法可定義為: #pragma ,其中 pragma-name 為編譯器支持 pragma 的名稱,pragma-arguments 是特定于 pragma 的參數(shù)。 例如 #pragma warning 表示啟用或禁用警告,#pragma checksum 表示生成校驗和。

      代碼示例:

      using System;
      
      #pragma warning disable 414, CS3021
      [CLSCompliant(false)]
      public class C
      {
          int i = 1;
          static void Main()
          {
          }
      }
      
      #pragma warning restore CS3021
      [CLSCompliant(false)]         
      public class D
      {
          int i = 1;
          public static void F()
          {
          }
      }
      

      代碼界面:

      3,預(yù)處理器指令的用途

      預(yù)處理器指令的用途總結(jié)為以下幾點:

      有利于項目的調(diào)式和運行。例如說可以使用條件編譯指令控制程序流的執(zhí)行,在實際的項目中表現(xiàn)為多版本代碼片段控制。在代碼的調(diào)式階段,可以使用錯誤和警告信息指令來禁止編譯不屬于本功能的額外代碼。使用定義區(qū)域指令可以很好折疊和隱藏指定區(qū)域的代碼片段。開發(fā)者可以更好的集中處理關(guān)鍵代碼,在有著多個代碼區(qū)域的項目十分的方便。

      結(jié)語

      到此這篇關(guān)于C# 預(yù)處理器指令的用法的文章就介紹到這了,更多相關(guān)C# 預(yù)處理器指令內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

      標(biāo)簽:

      免責(zé)聲明:市場有風(fēng)險,選擇需謹慎!此文僅供參考,不作買賣依據(jù)。

      資訊播報