C# 12 中的新增功能

本文內容

  1. 主構造函數
  2. 集合表達式
  3. ref readonly 參數
  4. 默認 Lambda 參數

顯示另外 5 個

C# 12 包括以下新增功能。 可以使用最新的?Visual Studio 2022?版本或?.NET 8 SDK?嘗試這些功能。

  • 主構造函數?- 在 Visual Studio 2022 版本 17.6 預覽版 2 中引入。

  • 集合表達式?- 在 Visual Studio 2022 版本 17.7 預覽版 5 中引入。

  • 內聯數組?- 在 Visual Studio 2022 版本 17.7 預覽版 3 中引入。

  • Lambda 表達式中的可選參數?- 在 Visual Studio 2022 版本 17.5 預覽版 2 中引入。

  • ref readonly?參數?- 在 Visual Studio 2022 版本 17.8 預覽版 2 中引入。

  • 任何類型的別名?- 在 Visual Studio 2022 版本 17.6 預覽版 3 中引入。

  • 實驗屬性?- 已在 Visual Studio 2022 版本 17.7 預覽版 3 中引入。

  • 攔截器?-?預覽功能?在 Visual Studio 2022 版本 17.7 預覽版 3 中引入。

主構造函數

現在可以在任何?class?和?struct?中創建主構造函數。 主構造函數不再局限于?record?類型。 主構造函數參數都在類的整個主體的范圍內。 為了確保顯式分配所有主構造函數參數,所有顯式聲明的構造函數都必須使用?this()?語法調用主構造函數。 將主構造函數添加到?class?可防止編譯器聲明隱式無參數構造函數。 在?struct?中,隱式無參數構造函數初始化所有字段,包括 0 位模式的主構造函數參數。

編譯器僅在?record?類型(record class?或?record struct?類型)中為主構造函數參數生成公共屬性。 對于主構造函數參數,非記錄類和結構可能并不總是需要此行為。

有關主構造函數的詳細信息,請參閱探索主構造函數的教程和實例構造函數的相關文章。

集合表達式

集合表達式引入了新的 terse 語法來創建常見的集合值。 可以使用展開運算符?..?將其他集合內聯到這些值中。

可以創建多個類似集合的類型,而無需使用外部 BCL 支持。 這些類型包括:

  • 數組類型,例如?int[]
  • System.Span<T>?和?System.ReadOnlySpan<T>。
  • 支持集合初始值設定項的類型,例如?System.Collections.Generic.List<T>。

以下示例演示了集合表達式的使用:

// Create an array:
int[] a = [1, 2, 3, 4, 5, 6, 7, 8];// Create a list:
List<string> b = ["one", "two", "three"];// Create a span
Span<char> c  = ['a', 'b', 'c', 'd', 'e', 'f', 'h', 'i'];// Create a jagged 2D array:
int[][] twoD = [[1, 2, 3], [4, 5, 6], [7, 8, 9]];// Create a jagged 2D array from variables:
int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[][] twoDFromVariables = [row0, row1, row2];

展開運算符(集合表達式中的?..)可將其參數替換為該集合中的元素。 參數必須是集合類型。 以下示例演示了展開運算符的工作原理:

int[] row0 = [1, 2, 3];
int[] row1 = [4, 5, 6];
int[] row2 = [7, 8, 9];
int[] single = [.. row0, .. row1, .. row2];
foreach (var element in single)
{Console.Write($"{element}, ");
}
// output:
// 1, 2, 3, 4, 5, 6, 7, 8, 9,

展開運算符的操作數是可以枚舉的表達式。 展開運算符可計算枚舉表達式的每個元素。

可以在需要元素集合的任何位置使用集合表達式。 它們可以指定集合的初始值,也可以作為參數傳遞給采用集合類型的方法。 可以在有關集合表達式的語言參考文章或功能規范中詳細了解集合表達式。

ref readonly?參數

C# 添加了?in?參數作為傳遞只讀引用的方法。?in?參數既允許變量和值,并且無需對參數進行任何注釋即可使用。

添加?ref readonly?參數可以更清楚地了解可能使用?ref?參數或?in?參數的 API:

  • 即使參數未修改,在?in?引入之前創建的 API 也可能會使用?ref。 可以使用?ref readonly?更新這些 API。 對于調用方來說,這不會是一項中斷性變更,就像參數?ref?更改為?in?那樣。 示例為?System.Runtime.InteropServices.Marshal.QueryInterface。
  • 采用?in?參數但邏輯上需要變量的 API。 值表達式不起作用。 示例為?System.ReadOnlySpan<T>.ReadOnlySpan<T>(T)。
  • 使用?ref?的 API,因為它們需要變量,但不改變該變量。 示例為?System.Runtime.CompilerServices.Unsafe.IsNullRef。

若要了解有關?ref readonly?參數的詳細信息,請參閱有關語言參考中的參數修飾符的文章,或參考只讀參數功能規范。

默認 Lambda 參數

現在可以為 Lambda 表達式的參數定義默認值。 語法和規則與將參數的默認值添加到任何方法或本地函數相同。

可以在有關?Lambda 表達式的文章中詳細了解 Lambda 表達式上的默認參數。

任何類型的別名

可以使用?using?別名指令創建任何類型的別名,而不僅僅是命名類型。 這意味著可以為元組類型、數組類型、指針類型或其他不安全類型創建語義別名。 有關詳細信息,請參閱功能規范。

內聯數組

運行時團隊和其他庫作者使用內聯數組來提高應用的性能。 內聯數組使開發人員能夠創建固定大小的?struct?類型數組。 具有內聯緩沖區的結構應提供類似于不安全的固定大小緩沖區的性能特征。 你可能不會聲明自己的內聯數組,但當它們從運行時 API 作為?System.Span<T>?或?System.ReadOnlySpan<T>?對象公開時,你將透明地使用這些數組。

內聯數組的聲明類似于以下?struct

[System.Runtime.CompilerServices.InlineArray(10)]
public struct Buffer
{private int _element0;
}

它們的用法與任何其他數組類似:

var buffer = new Buffer();
for (int i = 0; i < 10; i++)
{buffer[i] = i;
}foreach (var i in buffer)
{Console.WriteLine(i);
}

區別在于編譯器可以利用有關內聯數組的已知信息。 你可能會像使用任何其他數組一樣使用內聯數組。 有關如何聲明內聯數組的詳細信息,請參閱有關?struct?類型的語言參考。

Experimental 屬性

可以使用?System.Diagnostics.CodeAnalysis.ExperimentalAttribute?來標記類型、方法或程序集,以指示實驗性特征。 如果訪問使用?ExperimentalAttribute?注釋的方法或類型,編譯器將發出警告。 用?Experimental?特性標記的程序集中包含的所有類型都是實驗性的。 可以在有關編譯器讀取的常規屬性的文章或功能規范中閱讀詳細信息。

攔截器

?警告

攔截器是一項試驗性功能,在 C# 12 的預覽模式下提供。 在將來的版本中,該功能可能會發生中斷性變更或被刪除。 因此,不建議將其用于生產或已發布的應用程序。

若要使用攔截器,用戶項目必須指定屬性?<InterceptorsPreviewNamespaces>。 這是允許包含攔截器的命名空間的列表。

例如:<InterceptorsPreviewNamespaces>$(InterceptorsPreviewNamespaces);Microsoft.AspNetCore.Http.Generated;MyLibrary.Generated</InterceptorsPreviewNamespaces>

攔截器是一種方法,該方法可以在編譯時以聲明方式將對可攔截方法的調用替換為對其自身的調用。 通過讓攔截器聲明所攔截調用的源位置,可以進行這種替換。 攔截器可以向編譯中(例如在源生成器中)添加新代碼,從而提供更改現有代碼語義的有限能力。

在源生成器中使用攔截器修改現有編譯的代碼,而非向其中添加代碼。 源生成器將對可攔截方法的調用替換為對攔截器方法的調用。

如果你有興趣嘗試攔截器,可以閱讀功能規范來了解詳細信息。 如果使用該功能,請確保隨時了解此實驗功能的功能規范中的任何更改。 最終確定功能后,我們將在本站點上添加更多指導。

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

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

相關文章

ThreeJs同一個場景多個相機的顯示

在threeJs開發數字孿生中&#xff0c;我們正常是需要使用一個相機&#xff0c;畫面顯示的內容也就是這個相機拍攝到的內容&#xff0c;但是是否可以添加多個相機&#xff0c;可以同時從不同角度觀察模型呢&#xff0c;實際上是可以的&#xff0c;不過多個相機的拍攝到的畫面肯定…

Linux uname命令教程:了解系統信息和配置(附實例詳解和注意事項)

Linux uname命令介紹 uname&#xff08;Unix Name&#xff09;命令用于顯示系統信息&#xff0c;包括內核名稱、網絡節點名稱、操作系統名稱、版本號、硬件名稱和處理器類型。它是一個基本的系統管理工具&#xff0c;通常用于識別系統配置。 Linux uname命令適用的Linux版本 …

Linux服務:Nginx反向代理與負載均衡

一、Nginx反向代理 1、什么是反向代理&#xff1f; 代理分為兩類&#xff0c;正向代理和反向代理。 ①正向代理&#xff1a;幫助用戶訪問服務器&#xff0c;緩存服務器內容。 ②反向代理&#xff1a;代理服務器處理用戶的請求&#xff0c;決定轉發請求給誰處理負載均衡的作…

Go 與 Rust:導航編程語言景觀

在當今構建軟件時&#xff0c;開發者在編程語言上有著豐富的選擇。兩種脫穎而出的語言是 Go 和 Rust - 都很強大但卻截然不同。本文將從各種因素比較這兩種語言&#xff0c;以幫助您確定哪種更適合您的需求。 我們將權衡它們在并發、安全性、速度、互操作性等方面的方法。我們將…

Ubuntu篇——crontab修改編輯器

輸入命令: crontab -e 如果你的系統是第一次使用crontab服務&#xff0c;會首先讓你選擇一個編輯器 如果已經選擇過編輯器&#xff0c;后續想要修改默認編輯器&#xff0c;可以輸入sudo select-editor進行修改。

【GPU驅動開發】-GPU架構簡介

前言 不必害怕未知&#xff0c;無需恐懼犯錯&#xff0c;做一個Creator&#xff01; GPU&#xff08;Graphics Processing Unit&#xff0c;圖形處理單元&#xff09;是一種專門用于處理圖形和并行計算的處理器。GPU系統架構通常包括硬件和軟件層面的組件。 一、總體流程 應…

Node.js基礎---Express中間件

1. 概念 1.什么是中間件 中間件(Middleware)&#xff0c;特指業務流程的中間處理環節 2. Express 中間件的調用流程 當一個請求到達 Express 的服務器后&#xff0c;可以連續調用多個中間件&#xff0c;從而對這次請求進行預處理 3. Express 中間件格式 Express 的中間件&…

每周一算法:雙端隊列廣搜

題目鏈接 電路維修 題目描述 達達是來自異世界的魔女&#xff0c;她在漫無目的地四處漂流的時候&#xff0c;遇到了善良的少女翰翰&#xff0c;從而被收留在地球上。翰翰的家里有一輛飛行車。有一天飛行車的電路板突然出現了故障&#xff0c;導致無法啟動。 電路板的整體結…

Java實戰:SpringBoot集成ZXing實現二維碼生成與解析

一、引言 在信息化社會&#xff0c;二維碼已經深入到生活的各個角落&#xff0c;無論是支付、營銷、信息傳遞&#xff0c;甚至防偽溯源&#xff0c;二維碼都發揮了至關重要的作用。作為Java開發者&#xff0c;我們如何在SpringBoot項目中便捷地實現二維碼的生成與解析呢&#…

4、Redis-Set【常用】

目錄 一、Redis-Set特點 二、常用命令與交并差 三、Redis中Set類型應用場景 一、Redis-Set特點 1、無序&#xff1a;添加的是A,B,C&#xff1b;取出的可能是B,A,C 2、唯一&#xff1a;不允許元素重復 二、常用命令與交并差 常用命令 格式含義例子sadd key members[...]往k…

吳恩達機器學習筆記十四 多輸出的分類 多類和多標簽的區別 梯度下降優化 卷積層

這里老師想講的是multiclass classification和multilable classification的區別&#xff0c;下面是我從其他地方找到的說法: Multiclass classification 多類分類 意味著一個分類任務需要對多于兩個類的數據進行分類。比如&#xff0c;對一系列的橘子&#xff0c;蘋果或者梨的…

Stable Diffusion生成式擴散模型代碼實現原理

Stable Diffusion可以使用PyTorch或TensorFlow等深度學習框架來實現。這些框架提供了一系列的工具和函數&#xff0c;使得開發者可以更方便地構建、訓練和部署深度學習模型。因此可以使用PyTorch或TensorFlow來實現Stable Diffusion模型。 安裝PyTorch&#xff1a;確保您已經安…

Linux命令行與shell腳本編程大全-2.2

第二部分 shell腳本編程基礎 第11章構建基礎腳本 第12章結構化命令 第13章更多的結構化命令 第14章處理用戶輸入 第15章呈現數據 第16章腳本控制 第15章 呈現數據 15.1 理解輸入和輸出 15.1.1 標準文件描述符 Linux 系統會將每個對象當作文件來處理&#xff0c;這包括輸入和…

T3SF:一款功能全面的桌面端技術練習模擬框架

關于T3SF T3SF是一款功能全面的桌面端技術練習模擬框架&#xff0c;該工具針對基于主場景事件列表的各種事件提供了模塊化的架構&#xff0c;并包含了針對每一個練習定義的規則集&#xff0c;以及允許為對應平臺參數定義參數的配置文件。 該工具的主模塊能夠執行與其他特定模…

CDN原理探究

來源于百度&#xff1a; https://baike.baidu.com/item/%E5%86%85%E5%AE%B9%E5%88%86%E5%8F%91%E7%BD%91%E7%BB%9C/4034265?frge_ala 通過上圖&#xff0c;我們可以了解到&#xff0c;使用了CDN緩存后的網站的訪問過程變為&#xff1a; 用戶向瀏覽器提供要訪問的域名&#xff…

幻獸帕魯/Palworld服務器的最佳網絡設置、內存和CPU配置是什么?

幻獸帕魯/Palworld服務器的最佳網絡設置、內存和CPU配置是什么&#xff1f; 對于4到8人的玩家&#xff0c;推薦的配置是4核16G的CPU和16G的內存。10到20人的玩家選擇8核32G的CPU和32G或以上的內存。2到4人的玩家則建議選擇4核8G的CPU和8G的內存。對于32人的玩家&#xff0c;推…

YOLOV8介紹

原文鏈接&#xff1a; 1、 詳解YOLOv8網絡結構/環境搭建/數據集獲取/訓練/推理/驗證/導出 2、Yolov8的詳解與實戰 3、YOLOV8模型訓練部署&#xff08;實戰&#xff09;&#xff08;&#xff09;有具體部署和訓練實現代碼YOLOV8模型訓練部署&#xff08;實戰&#xff09;&…

Mybatis plus核心功能-IService

目錄 1 前言 2 使用方法 2.1 繼承ServiceImpl,> 2.2 基礎業務開發的使用 2.3 復雜業務開發的使用 2.3 Lambda查詢 2.4 Lambda更新 1 前言 我本以為Mapper層的類能夠繼承BaseMapper<XXX>&#xff0c;而不用我們手動寫一些mapper方法已經夠離譜了。沒想到海油膏…

linux上pip3 install torch==1.11和pip3 install torch==1.11+cu115區別

在linux上安裝torch時&#xff0c; 如果環境安裝好了CUDA環境&#xff0c; 那么安裝torch時不用刻意指定帶cuda的版本&#xff0c; 最終安裝的也是支持GPU的torch版本。但是仍然有一些小的區別&#xff0c;主要就是支持CUDA版本的不同。 (leo_py37) pinefieldedge-gpu-01:/dat…

Gradle構建項目

1.自己下載對應的gradle版本到本地。 2.maven國內鏡像&#xff08;settings.gradle中進行配置&#xff09; // google()maven { url https://maven.aliyun.com/repository/public/ }maven { url https://maven.aliyun.com/repository/google/}maven { url https://maven.aliyu…