共用方式為


.NET 6 的新功能

.NET 6 提供從 .NET 5 開始的 .NET 統一計劃的最後部分。 .NET 6 會統一行動、桌面、IoT 和雲端應用程式之間的 SDK、基底程式庫和執行階段。 除了這種統一之外,.NET 6 生態系統還提供:

  • 簡化開發:入門很容易。 C# 10 中的新語言功能可減少您需要撰寫的程式碼數量。 對 Web 堆疊和最少 API 的投資可以輕鬆快速編寫更小、更快的微服務。

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

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

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

預覽 功能預設為停用。 它們也不支援在生產環境中使用,並且可能會在未來的版本中刪除。 新功能 RequiresPreviewFeaturesAttribute 可用於註釋預覽 API,並且會有一個相應的分析器在您使用這些預覽 API 時提醒您。

Visual Studio 2022 和更新版本支援 .NET 6。

本文未涵蓋 .NET 6 的所有新功能。 若要查看所有新功能,以及本文中所列功能的詳細資訊,請參閱 宣布 .NET 6 部落格文章。

Performance

.NET 6 包含許多效能改善。 本節列出 FileStream設定檔引導優化AOT 編譯中的一些改進。 如需詳細資訊,請參閱 .NET 6 中的效能改善 部落格文章。

FileStream

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

設定檔引導式最佳化

設定檔引導最佳化 (PGO) 是 JIT 編譯器根據最常用的類型和程式碼路徑產生最佳化程式碼的地方。 .NET 6 引進了動態 PGO。 動態 PGO 與分層編譯互相配合,根據在層級 0 期間放置的額外工具進一步優化代碼。 動態 PGO 預設為停用,但您可以使用DOTNET_TieredPGO啟用它。 如需詳細資訊,請參閱 JIT 效能改善。

Crossgen2

.NET 6 引進了 Crossgen2,這是 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# 語言版本歷程記錄

為了配合這項工作,C# 的 .NET SDK 專案範本已現代化,以使用一些新的語言功能:

  • async Main 方法
  • 頂層陳述
  • 目標型別新運算式
  • 隱含 global using 指令
  • 檔案範圍的命名空間
  • 可為 NULL 的參考型別

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

F# 和 Visual Basic

F# 6 新增了 F# 語言和 F# 互動式的多項改進。 如需詳細資訊,請參閱 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 Description
dotnet 工作負載搜尋 搜尋可用的工作負載。
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、Blazor WebAssembly 應用程式的提前 (AOT) 編譯,以及單一頁面應用程式的改善。 此外,Blazor 元件現在可以從 JavaScript 轉譯,並與現有的 JavaScript 型應用程式整合。 如需詳細資訊,請參閱 ASP.NET Core 6 的新功能

OpenTelemetry

.NET 6 改善了對 OpenTelemetry 的支援,OpenTelemetry 是工具、API 和 SDK 的集合,可協助您分析軟體的效能和行為。 命名空間中的 System.Diagnostics.Metrics API 會實作 OpenTelemetry Metrics API 規格。 例如,有四個工具類別可支援不同的指標案例。 儀器類別包括:

安全性

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

CET 是一些較新的 Intel 和 AMD 處理器中可用的 Intel 技術。 它為硬體添加了功能,以防止某些控制流劫持攻擊。 .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 相容性、平臺相容性、修剪安全性、在字串串連和分割中使用 span、更快的字串 API 和更快的集合 API。 如需新 (和已移除) 分析器的完整清單,請參閱 分析器版本 - .NET 6

自訂平台防護裝置

Platform 相容性分析器會辨識Is<Platform>類別中的OperatingSystem方法,例如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 版本。

目標架構標誌

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

一般數學

預覽版提供了一項功能,即在 .NET 6 中可以對泛型類型使用運算子。 .NET 6 引進了許多介面,這些介面使用 C# 10 的新預覽功能,包含 static abstract 介面成員。 這些介面對應於不同的運算子,例如, IAdditionOperators 代表 + 運算子。 這些介面可在 System.Runtime.Experimental NuGet 套件中使用。 如需詳細資訊,請參閱 泛型數學 部落格文章。

NuGet 套件驗證

如果您是 NuGet 程式庫開發人員,新的 套件驗證工具 可讓您驗證套件是否一致且格式正確。 您可以確定是否:

  • 套件版本之間是否有重大變更。
  • 套件具有所有執行階段特定實作的相同一組公用 API。
  • 針對目標框架或執行階段的適用性是否存在任何差距。

如需詳細資訊,請參閱 套件驗證 部落格文章。

反射 API

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

這些 API 對於反射型工具和序列化程式很有用。

Microsoft.Extensions API

數個延伸模組命名空間在 .NET 6 中都有改善,如下表所示。

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

新的 LINQ API

.NET 6 中已新增許多 LINQ 方法。 下表中列出的大部分新方法在類型中 System.Linq.Queryable 都有對等的方法。

方法 Description
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 時區 ID。 如果 TimeZoneInfo.FindSystemTimeZoneById(String) 系統上找不到請求的時區,該方法已更新為自動將其輸入從 Windows 時區轉換為 IANA 時區(反之亦然)。 此外,還添加了新方法TryConvertIanaIdToWindowsId(String, String)TryConvertWindowsIdToIanaId,用於您仍需要手動從一種時區格式轉換為另一種時區格式的情況。

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

PriorityQueue 類別

PriorityQueue<TElement,TPriority> 類別代表同時具有值和優先順序的專案集合。 項目會以遞增的優先順序出入佇列,也就是說,優先順序值最低的項目會先出入佇列。 這個類別實作 最小堆 資料結構。

另請參閱