最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C# 預(yù)處理器指令語言

 更新時間:2026年06月20日 09:16:59   作者:叫我少年  
本文主要介紹了C# 預(yù)處理器指令的完整語言參考,涵蓋所有指令的精確語法、使用規(guī)則和邊界條件,具有一定的參考價值,感興趣的可以了解一下

C# 預(yù)處理器指令的完整語言參考,涵蓋所有指令的精確語法、使用規(guī)則和邊界條件。與前一篇教程風格的文章不同,這篇側(cè)重語法規(guī)范和細節(jié),適合需要精確查閱特定指令的開發(fā)者。

核心前提: C# 的預(yù)處理器指令沒有獨立的預(yù)處理器,由編譯器直接處理。指令必須獨占一行。不能像 C/C++ 那樣創(chuàng)建宏,條件編譯僅判斷符號是否定義(布爾邏輯)。

指令類別涵蓋指令
Nullable 上下文?#nullable enable/disable/restore及 annotations/warnings 子集
條件編譯?#if?、#elif?、#else?、#endif
符號定義?#define?、#undef
代碼區(qū)域?#region?、#endregion
診斷信息?#error?、#warning?、#line
編譯器指令?#pragma warning?、#pragma checksum
文件應(yīng)用?#!?(shebang)、#:

一、#nullable— 可為空上下文

控制可為 null 引用類型的注釋和警告。指令優(yōu)先級高于項目設(shè)置,效果持續(xù)到下一指令或文件結(jié)束。

1.1 基本形式

指令效果
?#nullable disable禁用可為空上下文(注釋 + 警告)
?#nullable enable啟用可為空上下文
?#nullable restore恢復(fù)為項目級別的設(shè)置

1.2 細粒度控制

可以單獨控制注釋(annotations,即 ?? 標記)和警告(warnings):

指令效果
?#nullable disable annotations禁用?標記(不檢查 nullability 注釋)
?#nullable enable annotations啟用?標記
?#nullable restore annotations恢復(fù)注釋設(shè)置為項目級別
?#nullable disable warnings禁用可為 null 警告
?#nullable enable warnings啟用可為 null 警告
?#nullable restore warnings恢復(fù)警告設(shè)置為項目級別

使用場景: 在一個項目逐步遷移到 nullable aware 時,可以局部啟用或禁用特定文件/區(qū)域。

 // 整個文件默認啟用 nullable
 #nullable enable
 ?
 public string? GetOptional() => null;   // string? 有效,返回 null 不報警告
 ?
 #nullable disable warnings
 public string GetRequired() => null;     // 返回 null 不報警告(warnings 已禁用)
 ?
 #nullable restore warnings
 // 后面的代碼恢復(fù)警告

二、條件編譯 —#if? /#elif? /#else? /#endif

2.1 基本語法

 #if SYMBOL
     // 當 SYMBOL 已定義時編譯
 #elif OTHER_SYMBOL
     // 當 OTHER_SYMBOL 已定義且前面條件不滿足時編譯
 #else
     // 前面所有條件都不滿足時編譯
 #endif

2.2 支持的運算符

運算符含義示例
?!邏輯非?#if !DEBUG
?==相等?#if NET8_0 == true
?!=不等?#if NET8_0 != true
?&&邏輯與?#if DEBUG && NET10_0
?||邏輯或?#if DEBUG || TRACE
?()分組?#if (DEBUG || TRACE) && !PRODUCTION

2.3 預(yù)定義符號

SDK 風格項目根據(jù)目標框架自動定義一組符號:

桌面 / 框架相關(guān):

目標框架精確版本符號范圍符號
.NET Framework 4.7.2?NET472?NET472_OR_GREATER
.NET Framework 4.8?NET48?NET48_OR_GREATER
.NET Standard 2.1?NETSTANDARD2_1?NETSTANDARD2_1_OR_GREATER

現(xiàn)代 .NET(.NET 5+):

目標框架精確版本符號范圍符號
.NET 8?NET8_0?NET8_0_OR_GREATER
.NET 9?NET9_0?NET9_0_OR_GREATER
.NET 10?NET10_0?NET10_0_OR_GREATER

平臺符號:

平臺符號帶版本號
Android?ANDROID?ANDROID35_0_OR_GREATER
iOS?IOS?IOS15_1_OR_GREATER
Windows?WINDOWS?WINDOWS10_0_17763_0_OR_GREATER

通用符號:

符號來源
?DEBUGDebug 生成配置自動定義
?TRACETrace 常量,默認開啟

2.4 多框架適配示例

 public static string DownloadContent(string url)
 {
 #if NET40
     WebClient _client = new WebClient();
     return _client.DownloadString(url);
 #else
     HttpClient _client = new HttpClient();
     return _client.GetStringAsync(url).Result;
 #endif
 }

三、符號定義 —#define? /#undef

3.1 語法

 #define MYTEST         // 定義符號
 #undef MYTEST         // 取消定義

3.2 關(guān)鍵規(guī)則

規(guī)則說明
位置必須在文件最開頭,在所有非預(yù)處理器代碼之前
作用域從定義位置到文件末尾
不能賦值?#define MYTEST 1?是非法的,只能聲明符號名
常量應(yīng)用需要常量值用const?,不要用#define
編譯器選項也可通過DefineConstants屬性全局定義
 // 正確 ?
 #define FEATURE_EXPERIMENTAL
 ?
 // 錯誤 ?
 #define FEATURE_EXPERIMENTAL true   // 編譯錯誤

四、#region? /#endregion— 代碼折疊 ?

4.1 語法

 #region 區(qū)域名稱
 // ... 可折疊的代碼 ...
 #endregion

4.2 規(guī)則

規(guī)則說明
配對?#region?必須由#endregion終止
嵌套?#region?內(nèi)可以嵌套另一個#region
與#if的關(guān)系不能重疊,但可互相嵌套:#region?內(nèi)含#if?塊,或#if?內(nèi)含#region
編譯影響不影響編譯,純 IDE 大綱視圖特性

4.3 正確 vs 錯誤的嵌套

 // ? 正確 — #if 完整包含在 #region 內(nèi)
 #region 多框架適配
 #if NET8_0_OR_GREATER
     Console.WriteLine(".NET 8+");
 #endif
 #endregion
 ?
 // ? 正確 — #region 完整包含在 #if 內(nèi)
 #if DEBUG
 #region 調(diào)試工具
     Console.WriteLine("Debug tools active");
 #endregion
 #endif
 ?
 // ? 錯誤 — 重疊(編譯失?。?
 #region 開始
 #if DEBUG
 #endregion       // ? 在 #if 沒有 #endif 之前關(guān)閉 #region
 #endif

4.4 示例

 #region MyClass definition
 public class MyClass
 {
     static void Main()
     {
     }
 }
 #endregion

常見坑: #region? 不能拆分 #if?/#endif? 塊。如果你在一個 #region? 內(nèi)打開了 #if?,必須在同一個 #region? 內(nèi)用 #endif 關(guān)閉。

五、診斷指令 —#error?、#warning?、#line

5.1#error— 主動生成編譯錯誤

 #error Deprecated code in this method.
 // 編譯錯誤 CS1029: #error: 'Deprecated code in this method.'

常用場景: 在不支持的條件下阻止編譯:

 #if !NET8_0_OR_GREATER
     #error This library requires .NET 8 or later.
 #endif

5.2#warning— 主動生成編譯警告

 #warning Deprecated code in this method.
 // 編譯警告 CS1030: #warning: 'Deprecated code in this method.'

5.3#line— 修改編譯輸出行號/文件名

指令效果
?#line 200 "Special.cs"強制編譯器以第 200 行、"Special.cs" 文件名報告后續(xù)代碼
?#line default恢復(fù)默認行號
?#line hidden對調(diào)試器隱藏后續(xù)行(逐步執(zhí)行時跳過)

C# 高級語法(適用于 DSL / 代碼生成器):

 #line (起始行, 起始列) - (結(jié)束行, 結(jié)束列) 列偏移 "原始源文件名"

常用場景:Razor 頁面將生成的 .cs? 文件中警告/錯誤映射回 .cshtml 原始源代碼。

六、#pragma指令

6.1#pragma warning— 警告控制

 #pragma warning disable 414, CS3021   // 從下一行起禁用指定警告
 // ... 受抑制的代碼 ...
 #pragma warning restore CS3021        // 恢復(fù)指定警告

格式控制:

 #pragma warning disable format   // 禁用代碼格式化(如 Ctrl+K,D)
 // ... 你想保留手動格式的代碼 ...
 #pragma warning restore format   // 恢復(fù)格式化

6.2#pragma checksum— 調(diào)試校驗和

主要為 ASP.NET 頁面設(shè)計,確保調(diào)試器找到正確的源文件:

 #pragma checksum "file.cs" "{3673e4ca-6098-4ec1-890f-8fceb2a794a2}" "hex-bytes..."

參數(shù):

  1. 文件名 — 源文件路徑
  2. GUID — 文件的唯一標識
  3. 校驗和字節(jié) — 十六進制字符串

七、#!? 和#:— 基于文件的應(yīng)用

7.1#!— Shebang

 #!/usr/bin/env dotnet
 Console.WriteLine("Hello");

Unix 下配合 chmod +x 可直接執(zhí)行。

7.2#:— 文件級配置

C# 編譯器忽略 #: 開頭的行,但它們被 .NET SDK 等工具按約定解析:

 #:package Spectre.Console@*
 #:sdk Microsoft.NET.Sdk.Web
 #:property PublishAot=false

八、指令不重疊關(guān)系速查

結(jié)構(gòu) A結(jié)構(gòu) B可以嵌套?條件
?#region?#region?完整嵌套
?#if?#if?完整嵌套
?#region?#if?一個完整包含另一個
?#region?#if?不能重疊/交錯

最后

這份參考文檔覆蓋了 C# 預(yù)處理器指令的全部語法規(guī)范。日常開發(fā)中最常用的就三類:#if DEBUG?、#nullable enable?、#region?。其余的(#line? 高級映射、#pragma checksum?)主要在代碼生成器和 ASP.NET 底層框架中使用。記住最核心的一條:C# 預(yù)處理指令沒有宏,條件編譯只判斷符號有沒有定義,不要把它當成 C/C++ 的 #define 宏來用。

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

相關(guān)文章

最新評論

剑河县| 翼城县| 东乡| 名山县| 哈尔滨市| 紫金县| 鹤庆县| 报价| 青海省| 陵川县| 大足县| 临武县| 昂仁县| 太康县| 韶关市| 天镇县| 大同县| 墨竹工卡县| 高邮市| 古交市| 昭平县| 资兴市| 南投县| 噶尔县| 赤峰市| 璧山县| 三河市| 博客| 上饶县| 金山区| 西乌| 从江县| 苗栗市| 包头市| 凤阳县| 清河县| 蓬安县| 剑川县| 安庆市| 达孜县| 华池县|