.NET 6 的新功能

.NET 6 會提供從 .NET 5 開始的 .NET 對應轉換計畫的最終部分。 .NET 6 會在行動裝置、桌面、IoT 和雲端應用程式中統一 SDK、基礎程式庫和執行時間。 除了此統一之外,6 個 .NET 生態系統也提供:

  • 簡化的開發:非常容易上手。 C# 10中的新語言功能可減少您需要撰寫的程式碼數量。 對 Web 堆疊和最少 API 的投資,可讓您輕鬆快速寫入較小且更快速的微服務。

  • 效能較佳:.NET 6 是最快的完整堆疊 Web 架構,如果在雲端中執行,則可降低計算成本。

  • 極致生產力:.NET 6 和 Visual Studio 2022 會提供熱重新載入、新 Git 工具、智慧型程式碼編輯、強固診斷和測試工具,及更好的小組共同作業。

.NET 6 是長期支援 (LTS) 版本,提供為期三年的支援

預設會停用預覽功能。 它們也不支援在生產環境中使用,且在未來版本中可能會移除。 如果您使用這些預覽 API,則會使用新的 RequiresPreviewFeaturesAttribute 標註預覽 API,而對應的分析器會傳送警示給您。

Visual Studio 2022 和 Visual Studio 2022 for Mac (和更新版本) 均支援 .NET 6。

本文未涵蓋 .NET 6 的所有新功能。 若要查看所有新功能及本文中所列出功能的更多相關資訊,請參閱隆重發表 .NET 6 部落格文章。

效能

.NET 6 包含許多效能改善。 本節列出部分改進功能,請參閱:FileStream特性指引最佳化AOT 編譯。 如需詳細資訊,請參閱 .NET 6 的效能改善部落格文章。

FileStream

System.IO.FileStream 類型已針對 .NET 6 重寫,在 Windows 上提供更好的效能和可靠性。 現在在 Windows 上針對非同步 I/O 時,FileStream 一律不會封鎖。 如需詳細資訊,請參閱 .NET 6 的檔案 IO 改善部落格文章。

特性指引最佳化

特性指引最佳化 (PGO) 是 JIT 編譯器根據最常用的類型和程式碼路徑產生最佳化程式碼的位置。 .NET 6 引進動態 PGO。 動態 PGO 可與階層式編譯搭配使用,根據第 0 層期間實施的其他檢測,進一步最佳化程式碼。 依預設會停用動態 PGO,但您可以使用DOTNET_TieredPGO環境變數將其啟用。 如需詳細資訊,請參閱 JIT 效能改善

Crossgen2

Crossgen2 由 .NET 6 引進,且為已移除的 Crossgen 後置項目。 Crossgen 和 Crossgen2 是提供預先 (AOT) 編譯的工具,改善應用程式啟動時間。 Crossgen2 以 C# 寫入 (而不是 C++),且可執行先前版本無法執行的分析和最佳化。 如需詳細資訊,請參閱 與 Crossgen2 對話

Arm64 支援

.NET 6 版本包含 macOS Arm64 (或 Apple Silicon) 和 Windows Arm64 作業系統的支援,適用於原生 Arm64 執行和 x64 模擬。 此外,x64 和 Arm64 .NET 安裝程式現在會並排安裝。 如需詳細資訊,請參閱適用於 Arm64 和 x64 之 macOS 11 和 Windows 11 的 .NET 支援

熱重新載入

熱重新載入 是一項功能,可讓您修改應用程式的原始程式碼,並立即將這些變更套用至執行中的應用程式。 此功能的目的是透過避免在編輯之間重新啟動應用程式,並提高生產力。 Visual Studio 2022 和 dotnet watch 命令行工具中可使用熱重新載入。 熱重新載入適用於大多數類型的 .NET 應用程式,及 C#、Visual Basic 和 C++ 原始程式碼。 如需詳細資訊,請參閱<熱重新載入>部落格文章

.NET MAUI

.NET 多平台應用程式 UI (.NET MAUI) 仍處於預覽階段,候選版將於 2022 年第一季度推出,並於 2022 年第二季度正式發行 (GA)。 .NET MAUI 可讓您使用單一程式碼基底組建桌面和行動版作業系統的原生用戶端應用程式。 如需詳細資訊,請參閱 .NET 多平台應用程式 UI 的更新部落格文章。

C# 10 與範本

C# 10 包含 global using 指示詞、以檔案為範圍的命名空間宣告和記錄結構等創新。 如需詳細資訊,請參閱 C# 10 的新功能

為了配合該工作,C# 的 .NET SDK 專案範本已經現代化處理,可使用部分新語言功能:

  • async Main 方法
  • 最上層陳述式
  • 目標型別新運算式
  • 隱含 global using 指示詞
  • 以檔案為範圍的命名空間
  • 可為 Null 的參考型別

透過將這些新的語言功能新增置專案範本,新的程式碼會從啟用的功能開始。 但當您升級至 .NET 6 時,現有的程式碼不受影響。 如需這些範本變更的詳細資訊,請參閱 .NET SDK:已現代化的 C# 專案範本部落格文章。

F# 和 Visual Basic

F# 6 針對 F# 語言和 F# Interactive新增數項改善。 如需詳細資訊,請參閱 F# 6 的新功能

Visual Basic 在 Visual Studio 體驗和Windows Forms 專案啟動方面有所改善。

SDK 工作負載

若要讓 .NET SDK 的大小保持較小,會將部分元件放在可選的新 SDK 工作負載中。 這些元件包括 .NET MAUI 和 Blazor WebAssembly AOT。 如果您使用 Visual Studio,它會負責安裝您所需的任何 SDK 工作負載。 如果您使用 .NET CLI,您可以使用新的 dotnet workload 命令管理工作負載:

Command 描述
dotnet workload search 搜尋可用的工作負載。
安裝 dotnet 工作負載 安裝指定的工作負載。
取消安裝 dotnet 工作負載 移除指定的工作負載。
更新 dotnet 工作負載 更新已安裝的工作負載。
修復 dotnet 工作負載 為了修復中斷的安裝,請重新安裝所有已安裝的工作負載。
列出 dotnet 工作負載 列出已安裝的工作負載。

如需詳細資訊,請參閱可選的 SDK 工作負載

System.Text.Json API

.NET 6 已進行許多 System.Text.Json 改善,因此現在是「工業強度」序列化解決方案。

來源產生器

.NET 6 為 System.Text.Json 新增新的 來源產生器。 來源產生可與 JsonSerializer 搭配使用,且可透過多種方式設定。 其可改善效能、減少記憶體使用量,並加速組件修剪。 如需詳細資訊,請參閱 如何在 System.Text.Json 中選擇反映或來源產生,及 如何在 System.Text.Json 中使用來源產生

可寫入 DOM

已新增新的可寫入文件物件模型 (DOM),以補充既有的唯讀 DOM。 新 API 會針對無法使用簡單的 CLR 物件 (POCO) 類型的情況,提供輕量型序列化替代方案。 其也可讓您有效率地瀏覽大型 JSON 樹狀結構的子區段,並從該子區段讀取陣列或還原序列化 POCO。 已新增下列新類型,支援可寫入的 DOM:

如需詳細資訊,請參閱 JSON DOM 選擇

IAsyncEnumerable 序列化

System.Text.Json 現在支援使用 IAsyncEnumerable<T> 執行個體序列化及還原序列化。 非同步序列化方法會列舉 IAsyncEnumerable<T> 物件圖中的任何執行個體,然後將其序列化為 JSON 陣列。 若是還原序列化,已新增新方法 JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken)。 如需詳細資訊,請參閱 IAsyncEnumerable 序列化

其他新 API

驗證和預設值的新序列化介面:

如需詳細資訊,請參閱 回撥

新的屬性排序屬性:

寫入「原始」JSON 的新方法:

同步序列化和還原序列化至資料流:

在序列化期間偵測到參考循環時略過物件的新選項:

如需使用序列化和還原序列化 System.Text.Json 的詳細資訊,請參閱 .NET 中的 JSON 序列化和還原序列化

HTTP/3

.NET 6 包含 HTTP/3 的預覽支援,此為新的 HTTP 版本。 HTTP/3 使用稱為 QUIC 的新基礎連線通訊協定解決部分現有功能和效能挑戰。 QUIC 建立連線更快速,且連線與 IP 位址無關,可讓行動用戶端在 Wi-fi 和行動資料網路之間漫遊。 如需詳細資訊,請參閱 搭配 HttpClient 使用 HTTP/3

ASP.NET Core

ASP.NET Core 包含最小 API、預先 (AOT) 編譯 Blazor WebAssembly 應用程式和單頁應用程式的改善。 此外,Blazor 元件現在可以從 JavaScript 轉譯,並與現有的 JavaScript 型應用程式整合。 如需詳細資訊,請參閱 ASP.NET Core 6 的新功能

OpenTelemetry

.NET 6 已改善 OpenTelemetry 的支援,這是一個工具、API 和 SDK 的集合,可協助您分析軟體的效能和行為。 System.Diagnostics.Metrics命名空間中的 API 會實作 OpenTelemetry 計量 API 規格。 例如,有四個檢測類別可支援不同的計量案例。 檢測類別如下:

安全性

.NET 6 新增兩個金鑰安全性風險降低的預覽支援:「控制流程強制技術 (CET)」和「寫入獨佔執行 (W^X)」。

CET 是一種 Intel 技術,可在部分較新的 Intel 和 AMD 處理器中使用。 它會將功能新增至硬體,並防止部分控制流程攔截攻擊。 .NET 6 為 Windows x64 應用程式提供 CET 支援,您必須明確將其啟用。 如需詳細資訊,請參閱 .NET 6 與 Intel CET 陰影堆疊的相容性

W^X 適用於具有 .NET 6 的作業系統,但僅在 Apple Silicon 上預設為啟用。 W^X 禁止同時寫入和可執行記憶體頁面,封鎖最簡單的攻擊路徑。

IL 修剪

已改善自成部署的修剪。 在 .NET 5 中僅修剪未使用的組件。 .NET 6 也新增未使用類型和成員的修剪。 此外,現在預設啟用修剪警示,會提醒您修剪可能會移除執階段使用的程式碼的位置。 如需詳細資訊,請參閱修剪獨立式部署及可執行檔

程式碼分析

.NET 6 SDK 包含部分新的程式碼分析器,涉及 API 相容性、平台相容性、修剪安全性、在字串串聯和分割的跨度使用、更快的字串 API 和集合 API。 如需新的 (和已移除的) 分析器完整清單,請參閱 分析器版本 - .NET 6

自訂平台成立條件

平台相容性分析器會將 OperatingSystem 類別中的 Is<Platform> 方法 (例如 OperatingSystem.IsWindows()) 辨識為平台成立條件。 為了允許自訂平台成立條件,.NET 6 引進兩個新屬性,可用來標註具有支援或不支援平台名稱的欄位、屬性或方法:

Windows Forms

Application.SetDefaultFont(Font) 是 .NET 6 中的新方法,可設定應用程式的預設字型。

C# Windows Forms 應用程式範本已更新,支援 global using 指示詞、以檔案為範圍的命名空間和可為 Null 的參考型別。 它們也包含應用程式啟動程序程式碼,可減少重複使用的程式碼,並可讓 Windows Forms 設計工具以偏好的字型呈現設計介面。 啟動程式碼是針對 ApplicationConfiguration.Initialize() 的呼叫,這是來源產生的方法,可發出對其他組態方法 (例如 Application.EnableVisualStyles()) 的呼叫。 此外,如果您透過 ApplicationDefaultFont MSBuild 屬性設定非預設字型,則會ApplicationConfiguration.Initialize() 發出對 SetDefaultFont(Font) 的呼叫。

如需詳細資訊,請參閱<Windows Forms 的新功能>部落格文章。

原始組建

包含 .NET SDK 所有來源的原始 tarball,現在是 .NET SDK 組建的產品。 其他組織 (例如 Red Hat) 可使用這個原始 tarball 組建自己的 SDK 版本。

目標 Framework Moniker

已針對 .NET 6 新增其他特定於作業系統的目標 Framework Moniker (TFM),例如 net6.0-androidnet6.0-iosnet6.0-macos。 如需詳細資訊,請參閱 .NET 5+ OS 特定 TFM

一般數學

預覽版中,可讓您在 .NET 6 中的泛型型別上使用運算子。 .NET 6 引進多種使用 C# 10 的新預覽功能 (static abstract 介面成員) 的介面。 這些介面對應至不同的運算子,例如 IAdditionOperators 代表 + 運算子。 這些介面可在 System.Runtime.Experimental NuGet 封裝中使用。 如需詳細資訊,請參閱<一般數學>部落格文章。

NuGet 封裝驗證

如果您是 NuGet 程式庫開發人員,新的 封裝驗證工具可讓您驗證封裝是否一致且語式正確。 您可以判斷是否:

  • 封裝版本之間有任何中斷性變更。
  • 封裝針對所有執行階段特定實作都具有相同的公開 API。
  • 目標架構或執行階段適用性有任何間距。

如需詳細資訊,請參閱<封裝驗證>部落格文章。

反映 API

.NET 6 引進下列檢查程式碼並提供可 NULL 性資訊的新 API:

這些 API 針對反映基礎映像型工具和序列化程式極為實用。

Microsoft.Extensions API

數個擴充命名空間在 .NET 6 中均有改善,如下表所示。

Namespace 改善
Microsoft.Extensions.DependencyInjection CreateAsyncScope 可讓您安全地為註冊 IAsyncDisposable 服務的服務提供者使用 using 陳述式。
Microsoft.Extensions.Hosting 新的 ConfigureHostOptions 方法可簡化應用程式設定。
Microsoft.Extensions.Logging Microsoft.Extensions.Logging 具有高效能記錄 API 的新來源產生器。 如果您將新的 LoggerMessageAttribute 新增至 partial 記錄方法,即會觸發來源產生器。 在編譯時間,產生器會產生 partial 方法的實作,通常執行階段比現有的記錄解決方案更快。 如需詳細資訊,請參閱 編譯時間記錄來源產生

新的 LINQ API

.NET 6 已新增多種 LINQ 方法。 下列表格中列出的大多數新方法在 System.Linq.Queryable 類型中均有對等的方法。

方法 描述
Enumerable.TryGetNonEnumeratedCount<TSource>(IEnumerable<TSource>, Int32) 嘗試判斷序列中的元素數目,而不強制列舉。
Enumerable.Chunk<TSource>(IEnumerable<TSource>, Int32) 將序列的元素分割為指定大小的區塊。
Enumerable.MaxByEnumerable.MinBy 使用索引鍵選取器尋找最大或最小元素。
Enumerable.DistinctByEnumerable.ExceptByEnumerable.IntersectByEnumerable.UnionBy 這些執行以集合為基礎的作業方法新變化可讓您使用索引鍵選取器函式指定相等。
Enumerable.ElementAt<TSource>(IEnumerable<TSource>, Index)Enumerable.ElementAtOrDefault<TSource>(IEnumerable<TSource>, Index) 接受從序列開頭或結尾計算的索引,例如Enumerable.Range(1, 10).ElementAt(^2) 傳回 9
Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, TSource)Enumerable.FirstOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, TSource)Enumerable.LastOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, TSource)Enumerable.SingleOrDefault<TSource>(IEnumerable<TSource>, Func<TSource,Boolean>, TSource)
新的多載可讓您指定序列為空時使用的預設值。
Enumerable.Max<TSource>(IEnumerable<TSource>, IComparer<TSource>)Enumerable.Min<TSource>(IEnumerable<TSource>, IComparer<TSource>) 新的多載可讓您指定比較子。
Enumerable.Take<TSource>(IEnumerable<TSource>, Range) 為了簡化取得序列的配量,請接受 Range 引數,例如,你可以使用 source.Take(2..7),而不是 source.Take(7).Skip(2)
Enumerable.Zip<TFirst,TSecond,TThird>(IEnumerable<TFirst>, IEnumerable<TSecond>, IEnumerable<TThird>) 三個指定序列中的元素產生一系列元組。

日期、時間和時區改善

.NET 6 新增了下列兩個結構:System.DateOnlySystem.TimeOnly。 這些分別代表 DateTime 的日期和時間組件。 DateOnly 適用於生日和紀念日,而 TimeOnly 適用於每日警示和每週營業時間。

您現在可在任何已安裝時區資料的作業系統上使用網際網路號碼分配局 (IANA) 或 Windows 時區識別碼。 TimeZoneInfo.FindSystemTimeZoneById(String) 方法已更新,如果在系統上找不到要求的時區,則會自動將其輸入從 Windows 時區轉換為 IANA 時區 (反之亦然)。 此外,當您仍然需要手動從某個時區格式轉換成另一個時區格式時,已新增案例的新方法 TryConvertIanaIdToWindowsId(String, String)TryConvertWindowsIdToIanaId

還有一些其它的時區改善。 如需詳細資訊,請參閱 .NET 6 的日期、時間和時區增強功能

PriorityQueue 類別

新的 PriorityQueue<TElement,TPriority> 類別代表同時具有值和優先順序的項目集合。 項目會依優先順序遞增清除佇列,即表示優先順序最低的項目會先清除佇列。 此類別會實作 最小堆積資料結構。

另請參閱