快訊 來(lái)源:腳本之家 2023-07-07 15:57:56
預(yù)處理器指令是指編譯器在實(shí)際編譯開(kāi)始之前對(duì)信息進(jìn)行預(yù)處理。通常用于簡(jiǎn)化源程序在不同的執(zhí)行環(huán)境中的更改和編譯。例如可以替換文本中的標(biāo)記,將其他內(nèi)容插入源文件,或者通過(guò)移除幾個(gè)部分的文本來(lái)取消一部分文件的編譯。不同于 C 和 C++ 中的指令,在 C# 中不能使用這些指令來(lái)創(chuàng)建宏,而且預(yù)處理器指令必須是一行中唯一的代碼,不能摻雜其它。
示例如下:
#define condition // 定義 condition 字符 using System; public class ExampleProgram { static void Main(string[] args) { #if (condition) // 測(cè)試 condition 是否為真 Console.WriteLine("condition is defined"); #else Console.WriteLine("condition is not defined"); #endif Console.ReadLine(); } }
在 C# 程序中,所有的預(yù)處理器指令都是以標(biāo)識(shí)符 # 開(kāi)始,例如 #define 和 #if,并且預(yù)處理器指令之前只能出現(xiàn)空格不能出現(xiàn)任何代碼。另外,預(yù)處理器指令不是語(yǔ)句,因此它們不需要以分號(hào);結(jié)尾。
【資料圖】
#nullable 預(yù)處理器指令用于設(shè)置可為空注釋上下文和為空警告上下文。#nullable 指令控制著是否可為空注釋是否有效,以及是否給出為 Null 的警告。設(shè)置著每個(gè)上下文要么處于已禁用狀態(tài),要么處于已啟用狀態(tài) 。
下表列出 #nullable 指令的用法:
用法 | 描述 |
---|---|
#nullable disable | 將可為空注釋和警告上下文設(shè)置為“已禁用”。 |
#nullable enable | 將可為空注釋和警告上下文設(shè)置為“已啟用”。 |
#nullable restore | 將可為空注釋和警告上下文還原為項(xiàng)目設(shè)置。 |
#nullable disable annotations | 將可為空注釋上下文設(shè)置為“已禁用”。 |
#nullable enable annotations | 將可為空注釋上下文設(shè)置為“已啟用”。 |
#nullable restore annotations | 將可為空注釋上下文還原為項(xiàng)目設(shè)置。 |
#nullable disable warnings | 將可為空警告上下文設(shè)置為“已禁用”。 |
#nullable enable warnings | 將可為空警告上下文設(shè)置為“已啟用”。 |
#nullable restore warnings | 將可為空警告上下文還原為項(xiàng)目設(shè)置。 |
代碼示例:
using System; public class ExampleProgram { static void Main(string[] args) { string? str; #nullable disable // 將可為空注釋和警告上下文設(shè)置為“已禁用”。 Console.WriteLine(str); // 報(bào)錯(cuò): 使用了未賦值的局部變量“str” #nullable enable // 將可為空注釋和警告上下文設(shè)置為“已啟用”。 Console.WriteLine(str); } }
代碼界面:(PS:筆者使用的代碼編輯器是 Visual Studio 2022)
可以使用定義符號(hào) #define 和 取消定義符號(hào) #undef 兩個(gè)預(yù)處理器指令來(lái)定義或取消定義條件編譯的符號(hào)。定義符號(hào)可用于 #if 等編譯指令的條件,使用 #define 來(lái)定義符號(hào),將符號(hào)用作傳遞給 #if 指令的表達(dá)式。
代碼示例:
#define VERBOSE // 定義符 #define using System; public class ExampleProgram { static void Main(string[] args) { #if VERBOSE Console.WriteLine("詳細(xì)輸出版本"); #endif } }
代碼執(zhí)行結(jié)果:
詳細(xì)輸出版本
可以使用以下四個(gè)預(yù)處理器指令來(lái)控制條件編譯:
#if:打開(kāi)條件編譯,其中僅在定義了指定的符號(hào)時(shí)才會(huì)編譯代碼。#elif:關(guān)閉前面的條件編譯,并基于是否定義了指定的符號(hào)打開(kāi)一個(gè)新的條件編譯。#else:關(guān)閉前面的條件編譯,如果沒(méi)有定義前面指定的符號(hào),打開(kāi)一個(gè)新的條件編譯。#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) // 測(cè)試 condition2 是否為真 Console.WriteLine("condition2 is defined"); #else Console.WriteLine("condition is not defined"); #endif Console.ReadLine(); } }
代碼執(zhí)行結(jié)果:
csharp condition2 is defined
補(bǔ)充:
#if 以及 #else、#elif、#endif、#define 和 #undef 指令,允許在這些指令之間存在一個(gè)或多個(gè)符號(hào)里面包括或排除代碼。其中,#if 指令開(kāi)頭的條件指令必須以 #endif 指令顯式終止??梢允褂?define 指令你定義一個(gè)符號(hào),通過(guò)將該符號(hào)用作傳遞給 #if 指令的表達(dá)式。條件編譯指令的用法和 C# 中的條件判斷語(yǔ)句 if、elif 和 else 語(yǔ)句差不多。
可以使用定義區(qū)域符號(hào) #region 和 #endregion 分別表示啟動(dòng)區(qū)域和結(jié)束區(qū)域。這兩個(gè)預(yù)處理器指令來(lái)定義可在大綱中折疊的代碼區(qū)域。利用 #region 和 #endregion 指令,可以指定在使用代碼編輯器的大綱功能時(shí)可展開(kāi)或折疊的代碼塊。#region 指令后面可跟折疊區(qū)域的名稱。在較長(zhǎng)的代碼文件中,折疊或隱藏一個(gè)或多個(gè)代碼區(qū)域十分方便。
代碼示例:
using System; #region MyClass definition public class ExampleProgram { static void Main(string[] args) { } } #endregion
折疊前:
折疊后:
可以使用錯(cuò)誤和警告信息指令告訴編譯器生成用戶定義的編譯器錯(cuò)誤和警告,并控制行信息。其中包括 #error、#warning 和 #line 指令。
#error:使用指定的消息生成編譯器錯(cuò)誤。
示例如下:
using System; public class ExampleProgram { static void Main(string[] args) { // 錯(cuò)誤:此方法中的棄用代碼。 #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:更改用編譯器消息輸出的行號(hào)。
示例如下:
using System; public class ExampleProgram { static void Main() { #line 200 "Special" int i; int j; #line default char c; float f; #line hidden // 編號(hào)不受影響 string s; double d; } }
編譯產(chǎn)生以下輸出:
#line 200 指令將下一行的行號(hào)強(qiáng)制設(shè)為 200(盡管默認(rèn)值為 #6);在執(zhí)行下一個(gè) #line 指令前,文件名都會(huì)報(bào)告為“特殊”。#line default 指令將行號(hào)恢復(fù)至默認(rèn)行號(hào),這會(huì)對(duì)上一指令重新編號(hào)的行進(jìn)行計(jì)數(shù)。#line hidden 指令能對(duì)調(diào)試程序隱藏連續(xù)行,當(dāng)開(kāi)發(fā)者逐行執(zhí)行代碼時(shí),介于 #line hidden 和下一 #line 指令(假設(shè)它不是其他 #line hidden 指令)間的任何行都將被跳過(guò)。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
#pragma 為編譯器給出特殊指令以編譯它所在的文件,這些指令必須受編譯器支持。換句話說(shuō),不能使用 #pragma 創(chuàng)建自定義的預(yù)處理指令。
#pragma 指令的語(yǔ)法可定義為: #pragma
代碼示例:
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() { } }
代碼界面:
預(yù)處理器指令的用途總結(jié)為以下幾點(diǎn):
有利于項(xiàng)目的調(diào)式和運(yùn)行。例如說(shuō)可以使用條件編譯指令控制程序流的執(zhí)行,在實(shí)際的項(xiàng)目中表現(xiàn)為多版本代碼片段控制。在代碼的調(diào)式階段,可以使用錯(cuò)誤和警告信息指令來(lái)禁止編譯不屬于本功能的額外代碼。使用定義區(qū)域指令可以很好折疊和隱藏指定區(qū)域的代碼片段。開(kāi)發(fā)者可以更好的集中處理關(guān)鍵代碼,在有著多個(gè)代碼區(qū)域的項(xiàng)目十分的方便。到此這篇關(guān)于C# 預(yù)處理器指令的用法的文章就介紹到這了,更多相關(guān)C# 預(yù)處理器指令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
標(biāo)簽:
免責(zé)聲明:市場(chǎng)有風(fēng)險(xiǎn),選擇需謹(jǐn)慎!此文僅供參考,不作買(mǎi)賣(mài)依據(jù)。