C# 11 中的新增功能

本文內容

  1. 泛型屬性
  2. 泛型數學支持
  3. 數值 IntPtr 和 UIntPtr
  4. 字符串內插中的換行符

顯示另外 11 個

C# 11 中增加了以下功能:

  • 原始字符串字面量
  • 泛型數學支持
  • 泛型屬性
  • UTF-8 字符串字面量
  • 字符串內插表達式中的換行符
  • 列表模式
  • 文件本地類型
  • 必需的成員
  • 自動默認結構
  • 常量?string?上的模式匹配?Span<char>
  • 擴展的?nameof?范圍
  • 數值 IntPtr
  • ref?字段和?scoped ref
  • 改進了方法組向委托的轉換
  • 警告波 7

.NET 7 支持 C# 11。 有關詳細信息,請參閱?C# 語言版本控制。

可以通過?.NET 下載頁下載最新 .NET 7 SDK。 還可以下載?Visual Studio 2022,其中包括 .NET 7 SDK。

?備注

我們有興趣了解你對這些功能的反饋。 如果發現這些新功能存在問題,請在?dotnet/roslyn?存儲庫中創建新問題。

泛型屬性

可以聲明基類為?的泛型類。 此功能為需要?System.Type?參數的屬性提供了更方便的語法。 以前需要創建一個屬性,該屬性將?Type?作為其構造函數參數:

C#復制

// Before C# 11:
public class TypeAttribute : Attribute
{public TypeAttribute(Type t) => ParamType = t;public Type ParamType { get; }
}

并且為了應用該屬性,需要使用?typeof?運算符:

C#復制

[TypeAttribute(typeof(string))]
public string Method() => default;

使用此新功能,可以改為創建泛型屬性:

C#復制

// C# 11 feature:
public class GenericAttribute<T> : Attribute { }

然后指定類型參數以使用該屬性:

C#復制

[GenericAttribute<string>()]
public string Method() => default;

應用屬性時,必須提供所有類型參數。 換句話說,泛型類型必須完全構造。 在上面的示例中,可以省略空括號 ((?和?)),因為特性沒有任何參數。

C#復制

public class GenericType<T>
{[GenericAttribute<T>()] // Not allowed! generic attributes must be fully constructed types.public string Method() => default;
}

類型參數必須滿足與?typeof?運算符相同的限制。 不允許使用需要元數據注釋的類型。 例如,不允許將以下類型用作類型參數:

  • dynamic
  • string?(或任何可為 null 的引用類型)
  • (int X, int Y)(或使用 C# 元組語法的任何其他元組類型)。

這些類型不會直接在元數據中表示出來。 它們包括描述該類型的注釋。 在所有情況下,都可以改為使用基礎類型:

  • object(對于?dynamic)。
  • string,而不是?string?
  • ValueTuple<int, int>,而不是?(int X, int Y)

泛型數學支持

有幾個語言功能支持泛型數學支持:

  • static virtual?接口中的成員
  • 已檢查的用戶定義的運算符
  • 寬松移位運算符
  • 無符號右移運算符

可以在接口中添加?static abstract?或?static virtual?成員,以定義包含可重載運算符、其他靜態成員和靜態屬性的接口。 此功能的主要場景是在泛型類型中使用數學運算符。 例如,可以在實現?operator +?的類型中實現?System.IAdditionOperators<TSelf, TOther, TResult>?接口。 其他接口定義其他數學運算或明確定義的值。 可以在有關接口的文章中了解新語法。 包含?static virtual?方法的接口通常是泛型接口。 此外,大部分將聲明一個約束,即類型參數實現聲明接口。

可以在探索靜態抽象接口成員教程或?.NET 6 中的預覽功能 - 泛型數學博客文章中了解詳細信息并親自嘗試該功能。

泛型數學對語言創建了其他要求。

  • 無符號右移運算符:在 C# 11 之前,若要強制無符號右移,需要將任何帶符號整數類型強制轉換為無符號類型,執行移動,然后將結果強制轉換回帶符號類型。 從 C# 11 開始,可以使用?>>>無符號移動運算符。
  • 寬松的移動運算符要求:C# 11 刪除了第二個操作數必須是?int?或隱式轉換為?int?的要求。 此更改允許在這些位置使用實現泛型數學接口的類型。
  • 已檢查和未檢查的用戶定義運算符:開發人員現在可以定義?checked?和?unchecked?算術運算符。 編譯器根據當前上下文生成對正確變體的調用。 有關?checked?運算符的詳細信息,可以閱讀有關算術運算符的文章。

數值?IntPtr?和?UIntPtr

現在?nint?和?nuint?類型的別名分別為?System.IntPtr?和?System.UIntPtr。

字符串內插中的換行符

字符串內插的?{?和?}?字符內的文本現在可以跨多個行。?{?和?}?標記之間的文本分析為 C#。 允許任何合法 C#(包括換行符)。 使用此功能可以更輕松地讀取使用較長 C# 表達式的字符串內插,例如模式匹配?switch?表達式或 LINQ 查詢。

可以在語言參考的字符串內插文章中了解有關換行符功能的詳細信息。

列表模式

列表模式擴展了模式匹配,以匹配列表或數組中的元素序列。 例如,當?sequence?為數組或三個整數(1、2 和 3)的列表時,sequence is [1, 2, 3]?為?true。 可以使用任何模式(包括常量、類型、屬性和關系模式)來匹配元素。 棄元模式 (_) 匹配任何單個元素,新的范圍模式 (..) 匹配零個或多個元素的任何序列。

可以在語言參考的模式匹配文章中了解有關列表模式的更多詳細信息。

改進了方法組向委托的轉換

方法組轉換上的 C# 標準現在包含以下項:

  • 允許轉換(但不是必需的)以使用已包含這些引用的現有委托實例。

以前版本的標準禁止了編譯器重用為方法組轉換而創建的委托對象。 C# 11 編譯器緩存從方法組轉換創建的委托對象,并重用該單個委托對象。 此功能最初在 Visual Studio 2022 版本 17.2 中作為預覽功能提供,在 .NET 7 預覽版 2 中首次提供。

原始字符串文本

原始字符串字面量是字符串字面量的一種新格式。 原始字符串字面量可以包含任意文本,包括空格、新行、嵌入引號和其他特殊字符,無需轉義序列。 原始字符串字面量以至少三個雙引號 (""") 字符開頭。 它以相同數量的雙引號字符結尾。 通常,原始字符串字面量在單個行上使用三個雙引號來開始字符串,在另一行上用三個雙引號來結束字符串。 左引號之后、右引號之前的換行符不包括在最終內容中:

C#復制

string longMessage = """This is a long message.It has several lines.Some are indentedmore than others.Some should start at the first column.Some have "quoted text" in them.""";

右雙引號左側的任何空格都將從字符串字面量中刪除。 原始字符串字面量可以與字符串內插結合使用,以在輸出文本中包含大括號。 多個?$?字符表示有多少個連續的大括號開始和結束內插:

C#復制

var location = $$"""You are at {{{Longitude}}, {{Latitude}}}""";

前面的示例指定了兩個大括號開始和結束內插。 第三個重復的左大括號和右大括號包括在輸出字符串中。

可以在編程指南中關于字符串的文章中,以及關于字符串字面量和內插字符串的語言參考文章中詳細了解原始字符串字面量。

自動默認結構

C# 11 編譯器可以確保在執行構造函數的過程中,將?struct?類型的所有字段初始化為其默認值。 此更改意味著,任何未由構造函數初始化的字段或自動屬性都由編譯器自動初始化。 現在,構造函數未明確分配所有字段的結構可以進行編譯,并且未顯式初始化的任何字段都設置為其默認值。 有關此更改如何影響結構初始化的詳細信息,請閱讀有關結構的文章。

常量?string?上的模式匹配?Span<char>?或?ReadOnlySpan<char>

你已經能夠在幾個版本中使用模式匹配來測試?string?是否有某個特定的常量值。 現在,可以將同一模式匹配邏輯用于?Span<char>?或?ReadOnlySpan<char>?的變量。

擴展的 nameof 范圍

在該方法的屬性聲明中的?nameof?表達式中使用時,類型參數名稱和參數名稱現在處于范圍內。 此功能意味著可以使用?nameof?運算符在方法或參數聲明的屬性中指定方法參數的名稱。 此功能最常用于為可為空分析添加屬性。

UTF-8 字符串字面量

可以對字符串字面量指定?u8?后綴來指定 UTF-8 字符編碼。 如果應用程序需要 UTF-8 字符串,則對于 HTTP 字符串常量或類似的文本協議來說,可以使用此功能來更輕松地創建 UTF-8 字符串。

有關 UTF-8 字符串字面量的詳細信息,請參閱關于內置引用類型的文章的字符串字面量部分。

必需的成員

可以將?required?修飾符添加到屬性和字段,以強制構造函數和調用方初始化這些值。 可以將?System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute?添加到構造函數,以通知編譯器構造函數將初始化所有必需的成員。

有關所需成員的詳細信息,請參閱屬性文章的僅限初始化部分。

ref?字段和?ref scoped?變量

可以在?ref struct?中聲明?ref?字段。 這支持沒有特殊特性或隱藏的內部類型的?System.Span<T>?等類型。

可向任意?ref?聲明添加?scoped?修飾符。 這限制了可將引用轉義到的范圍。

文件本地類型

從 C# 11 開始,可以使用?file?訪問修飾符創建其可見性范圍限定為其聲明時所在的源文件的類型。 此功能可幫助源生成器創建者避免命名沖突。 可以在語言參考中有關文件范圍類型的文章中詳細了解此功能。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36580.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36580.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36580.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【設計模式】MVC 模式

MVC 模式代表 Model-View-Controller&#xff08;模型-視圖-控制器&#xff09; 模式。這種模式用于應用程序的分層開發。 Model&#xff08;模型&#xff09; - 模型代表一個存取數據的對象或 JAVA POJO。它也可以帶有邏輯&#xff0c;在數據變化時更新控制器。View&#xff…

Linux6.37 Kubernetes 集群調度

文章目錄 計算機系統5G云計算第三章 LINUX Kubernetes 集群調度一、調度約束1.調度過程2.指定調度節點3.親和性1&#xff09;節點親和性2&#xff09;Pod 親和性3&#xff09;鍵值運算關系 4.污點(Taint) 和 容忍(Tolerations)1&#xff09;污點(Taint)2&#xff09;容忍(Toler…

centos搭建k8s

centos搭建k8s環境_centos k8s_進擊的Coders的博客-CSDN博客

VSCODE[配置ssh免密遠程登錄]

配置ssh免密遠程登錄 本文摘錄于&#xff1a;https://blog.csdn.net/qq_44571245/article/details/123031276只是做學習備份之用&#xff0c;絕無抄襲之意&#xff0c;有疑惑請聯系本人&#xff01; 這里要注意如下幾個地方: 1.要進入.ssh目錄創建文件: 2.是拷貝帶"ssh-…

微服務系列文章之 Springboot+Vue實現登錄注冊

一、springBoot 創建springBoot項目 分為三個包&#xff0c;分別為controller&#xff0c;service&#xff0c; dao以及resource目錄下的xml文件。 UserController.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 …

如何利用 EMC 模型解決能源服務提供商的瓶頸

01. 什么是合同能源管理&#xff1f; 合同能源管理(EMC-Energy Management Contract) 是一種新型的市場化節能機制,其實質就是以減少的能源費用來支付節能項目全部成本的節能投資方式。&#xff1a;節能服務公司與用能單位以契約形式約定節能項目的節能目標&#xff0c;節能服…

(二)Node.js 基礎模塊

&#xff08;二&#xff09;Node.js 基礎模塊 1. fs文件系統模塊1.1 什么是fs文件系統模塊1.2 讀取指定文件中的內容1. fs.readFile()的語法格式2. fs.readFile()的示例代碼 1.3 向指定的文件中寫入內容1. fs.writeFile()的語法格式2. fs.writeFile()的實例代碼 1.4 __dirname …

正則表達式的使用

1、正則表達式-教程 正則表達式&#xff1a;文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a到z之間的字母&#xff09;和特殊字符&#xff08;稱為元字符&#xff09;。 正則表達式使用單個字符串來描述&#xff0c;匹配一系列匹配某個句法規則的字符串。 2、…

《論文閱讀13》Efficient Urban-scale Point Clouds Segmentationwith BEV Projection

一、論文 研究領域&#xff1a; 城市級3D語義分割論文&#xff1a;Efficient Urban-scale Point Clouds Segmentationwith BEV Projection清華大學&#xff0c;新疆大學2021.9.19論文github論文鏈接 二、論文概要 2.1主要思路 提出了城市級3D語義分割新的方法&#xff0c;將…

1.SpringMVC接收請求參數及數據回顯:前端url地址欄傳遞參數通過轉發顯示在網頁

1、SpringMVC 處理前端提交的數據 1.1 提交的域名和處理方法的參數不一致&#xff0c;使用注解解決 1.2 提交的域名和處理方法的參數不一致&#xff0c;使用注解解決 1.3 提交的是一個對象 2、前端url地址欄傳遞的是一個參數 請求地址url&#xff1a;http://localhost:8080/s…

測試開發工程師到底是做什么的?

一二三線互聯網公司對測試開發工程師的要求&#xff1a; 現在很多測試的同事對測試開發工程師的認識都有一定的誤差。 我最早在阿里的時候和測試開發工程師溝通的時候&#xff0c;發現阿里的測試開發工程師&#xff0c;他們基本上都分為兩種&#xff0c;一種是業務類型的&…

Python基礎教程: json序列化詳細用法介紹

前言 嗨嘍&#xff0c;大家好呀~這里是愛看美女的茜茜吶 Python內置的json模塊提供了非常完善的對象到JSON格式的轉換。 廢話不多說&#xff0c;我們先看看如何把Python對象變成一個JSON&#xff1a; d dict(nameKaven, age17, sexMale) print(json.dumps(d)) # {"na…

【Linux】環境變量

目錄 一、環境變量的概念二、 常見的環境變量1.查看環境變量的方法2.PATH3.HOME4.SHELL 三、環境變量的相關指令四、命令行參數 一、環境變量的概念 環境變量(environment variables)一般是指在操作系統中用來指定操作系統運行環境的一些參數 如&#xff1a;我們在編寫C/C代碼的…

Prometheus技術文檔-基本使用-配置文件全解!!!!!

簡介&#xff1a; Prometheus是一個開源的系統監控和告警系統&#xff0c;由Google的BorgMon監控系統發展而來。它主要用于監控和度量各種時間序列數據&#xff0c;比如系統性能、網絡延遲、應用程序錯誤等。Prometheus通過采集監控數據并存儲在時間序列數據庫中&#xff0c;…

【視頻】使用OBS將MP4推流至騰訊云直播

1、下載OBS OBS官網:https://obsproject.com/ OBS支持Win、Mac、Linux,如果下載速度很慢,建議使用迅雷下載 2、OBS推流設置 2.1 添加場景 默認會有一個“場景”,如果想繼續添加可以點擊“+”按鈕 2.2 添加媒體源 1)點擊“來源”窗口中“+”按鈕 2)支持的媒體源如…

什么是Redis緩存雪崩、緩存穿透、緩存擊穿

緩存穿透&#xff08;Cache Penetration&#xff09; 什么是緩存穿透&#xff1f; 緩存穿透是指惡意或無效的請求導致緩存無法命中&#xff0c;從而每個請求都需要訪問數據庫。這可能發生在請求的數據根本不存在于緩存和數據庫中。 緩存穿透解決方案 使用布隆過濾器&#x…

安裝Tomac服務器——安裝步驟以及易出現問題的解決方法

文章目錄 前言 一、下載Tomcat及解壓 1、選擇下載版本&#xff08;本文選擇tomcat 8版本為例&#xff09; 2、解壓安裝包 二、配置環境 1、在電腦搜索欄里面搜索環境變量即可 2、點擊高級系統設置->環境變量->新建系統變量 1) 新建系統變量&#xff0c;變量名為…

【學會動態規劃】最大子數組和(19)

目錄 動態規劃怎么學&#xff1f; 1. 題目解析 2. 算法原理 1. 狀態表示 2. 狀態轉移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后&#xff1a; 動態規劃怎么學&#xff1f; 學習一個算法沒有捷徑&#xff0c;更何況是學習動態規劃&#xff0c; 跟我…

LeetCode 0088. 合并兩個有序數組

【LetMeFly】88.合并兩個有序數組&#xff1a;O(m 1) O(1)的做法 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/merge-sorted-array/ 給你兩個按 非遞減順序 排列的整數數組 nums1 和 nums2&#xff0c;另有兩個整數 m 和 n &#xff0c;分別表示 nums1 和 nums2…

Linux:Shell編輯之文本處理器(sed)

目錄 緒論 1、sed的原理&#xff1a;讀取 執行 顯示 三個過程 2、sed 文本內容處理工具&#xff0c;文件過大怎么辦&#xff1f; 3、sed的操作選項 3.1 常用選項 3.2 操作符 3.3 行號的范圍打印 3.4 對包含指定字符串的內容進行打印 3.5 刪 3.5.1 正則表達式刪除 3.6…