.NET 6 攻略大全(一)
點(diǎn)擊上方藍(lán)字
關(guān)注我們
(本文閱讀時間:15分鐘)
歡迎使用 .NET 6。今天的版本是.NET 團(tuán)隊(duì)和社區(qū)一年多努力的結(jié)果。C# 10 和 F# 6 提供了語言改進(jìn),使您的代碼更簡單、更好、性能大幅提升,我們已經(jīng)看到微軟降低了托管云服務(wù)的成本。.NET 6 是第一個原生支持 Apple Silicon (Arm64) 的版本,并且還針對 Windows Arm64 進(jìn)行了改進(jìn)。我們構(gòu)建了一個新的動態(tài)配置文件引導(dǎo)優(yōu)化 (PGO) 系統(tǒng),該系統(tǒng)可提供僅在運(yùn)行時才可能進(jìn)行的深度優(yōu)化。使用dotnet monitor 和 OpenTelemetry 改進(jìn)了云診斷。WebAssembly 支持更有能力和性能。為HTTP/3添加了新的 API ,處理 JSON、數(shù)學(xué)和直接操作內(nèi)存。.NET 6 將支持三年。開發(fā)人員已經(jīng)開始將應(yīng)用程序升級到 .NET 6,我們在生產(chǎn)中聽到了很好的早期成果。.NET 6 已為您的應(yīng)用程序做好準(zhǔn)備。
您可以下載適用于 Linux、macOS 和 Windows 的.NET 6 。
安裝程序和二進(jìn)制文件
容器圖像
Linux 軟件包
發(fā)行說明
API 差異
已知的問題
GitHub 問題跟蹤器
請參閱 ASP.NET Core、Entity Framework、Windows Forms、.NET MAUI、YARP 和 dotnet 監(jiān)視器帖子,了解各種場景中的新增功能。
.NET 6?下載
https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0
.NET 6 亮點(diǎn)?
.NET 6 是
使用 Microsoft 服務(wù)、其他公司運(yùn)行的云應(yīng)用程序和開源項(xiàng)目進(jìn)行生產(chǎn)壓力測試。
作為最新的長期支持 (LTS) 版本支持三年。
跨瀏覽器、云、桌面、物聯(lián)網(wǎng)和移動應(yīng)用程序的統(tǒng)一平臺,所有這些都使用相同的 .NET 庫并能夠輕松共享代碼。
性能得到了極大的提高,尤其是文件 I/O,這共同導(dǎo)致了執(zhí)行時間、延遲和內(nèi)存使用的減少。
C# 10 提供了語言改進(jìn),例如記錄結(jié)構(gòu)、隱式使用和新的 lambda 功能,而編譯器添加了增量源生成器。F# 6添加了新功能,包括基于任務(wù)的異步、管道調(diào)試和眾多性能改進(jìn)。
Visual Basic 在 Visual Studio 體驗(yàn)和 Windows 窗體項(xiàng)目打開體驗(yàn)方面有所改進(jìn)。
Hot Reload 使您能夠跳過重新構(gòu)建和重新啟動您的應(yīng)用程序以查看新更改(在您的應(yīng)用程序運(yùn)行時),Visual Studio 2022 和 .NET CLI 支持 C# 和 Visual Basic。
云診斷已通過 OpenTelemetry 和 dotnet monitor 得到改進(jìn),現(xiàn)在在生產(chǎn)中支持并在 Azure 應(yīng)用服務(wù)中可用。
JSON API 的功能更強(qiáng)大,并且通過序列化程序的源生成器具有更高的性能。
ASP.NET Core 中引入的最小 API 可簡化入門體驗(yàn)并提高 HTTP 服務(wù)的性能。
Blazor 組件現(xiàn)在可以從 JavaScript 呈現(xiàn)并與現(xiàn)有的基于 JavaScript 的應(yīng)用程序集成。
Blazor WebAssembly (Wasm) 應(yīng)用程序的 WebAssembly AOT編譯,以及對運(yùn)行時重新鏈接和本機(jī)依賴項(xiàng)的支持。
使用 ASP.NET Core 構(gòu)建的單頁應(yīng)用程序現(xiàn)在使用更靈活的模式,可與 Angular、React 和其他流行的前端 JavaScript 框架一起使用。
添加了 HTTP/3,以便 ASP.NET Core、HttpClient 和 gRPC 都可以與 HTTP/3 客戶端和服務(wù)器交互。
File IO 現(xiàn)在支持符號鏈接,并且通過 re-written-from-scratch 大大提高了性能FileStream。
通過支持 OpenSSL 3、ChaCha20Poly1305 加密方案和運(yùn)行時深度防御緩解,特別是 W^X和CET,安全性得到了改進(jìn)。
可以為 Linux、macOS 和 Windows(以前只有 Linux)發(fā)布單文件應(yīng)用程序(免提取)。
IL 修整現(xiàn)在更加強(qiáng)大和有效,新的警告和分析器可確保正確的最終結(jié)果。
添加了源生成器和分析器,可幫助您生成更好、更安全和更高性能的代碼。
源代碼構(gòu)建使 Red Hat 等組織能夠從源代碼構(gòu)建 .NET 并向其用戶提供自己的構(gòu)建。
該版本包括大約一萬次 git 提交。即使這篇文章很長,它也跳過了許多改進(jìn)。您必須下載并試用.NET 6 才能看到所有新功能。
支持
.NET 6 是一個長期支持 (LTS) 版本,將支持三年。它支持多種操作系統(tǒng),包括 macOS Apple Silicon 和 Windows Arm64。
Red Hat 與 .NET 團(tuán)隊(duì)合作,在 Red Hat Enterprise Linux 上支持 .NET。在 RHEL 8 及更高版本上,.NET 6 將可用于 AMD 和 Intel (x64_64)、ARM (aarch64) 以及 IBM Z 和 LinuxONE (s390x) 架構(gòu)。
請開始將您的應(yīng)用程序遷移到 .NET 6,尤其是 .NET 5 應(yīng)用程序。我們從早期采用者那里聽說,從 .NET Core 3.1 和 .NET 5 升級到 .NET 6 很簡單。
Visual Studio 2022 和 Visual Studio 2022 for Mac 支持 .NET 6 。Visual Studio 2019、Visual Studio for Mac 8 或 MSBuild 16 不支持它。如果要使用 .NET 6,則需要升級到Visual Studio 2022(現(xiàn)在也是 64 位)。Visual Studio Code C# 擴(kuò)展支持 .NET 6 。
Azure App 服務(wù):
Azure Functions 現(xiàn)在支持在 .NET 6 中運(yùn)行無服務(wù)器函數(shù)。
App Service .NET 6 GA Announcement 為 ASP.NET Core 開發(fā)人員提供了信息和詳細(xì)信息,他們很高興今天開始使用 .NET 6。
Azure 靜態(tài) Web 應(yīng)用現(xiàn)在支持帶有 Blazor WebAssembly 前端和 Azure Function API 的全棧 .NET 6 應(yīng)用程序。
注意:如果您的應(yīng)用已經(jīng)在應(yīng)用服務(wù)上運(yùn)行 .NET 6 預(yù)覽版或 RC 版本,則在將 .NET 6 運(yùn)行時和 SDK 部署到您所在區(qū)域后,它將在第一次重新啟動時自動更新。如果您部署了一個獨(dú)立的應(yīng)用程序,您將需要重新構(gòu)建和重新部署。
統(tǒng)一擴(kuò)展平臺
.NET 6 為瀏覽器、云、桌面、物聯(lián)網(wǎng)和移動應(yīng)用程序提供了一個統(tǒng)一的平臺。底層平臺已更新,可滿足所有應(yīng)用類型的需求,并便于在所有應(yīng)用中重用代碼。新功能和改進(jìn)同時適用于所有應(yīng)用程序,因此您在云或移動設(shè)備上運(yùn)行的代碼的行為方式相同并具有相同的優(yōu)勢。
.NET 開發(fā)人員的范圍隨著每個版本的發(fā)布而不斷擴(kuò)大。機(jī)器學(xué)習(xí)和 WebAssembly 是最近添加的兩個。例如,通過機(jī)器學(xué)習(xí),您可以編寫在流數(shù)據(jù)中查找異常的應(yīng)用程序。使用 WebAssembly,您可以在瀏覽器中托管 .NET 應(yīng)用程序,就像 HTML 和 JavaScript 一樣,或者將它們與 HTML 和 JavaScript 混合使用。
最令人興奮的新增功能之一是.NET Multi-platform App UI (.NET MAUI)。您現(xiàn)在可以在單個項(xiàng)目中編寫代碼,從而跨桌面和移動操作系統(tǒng)提供現(xiàn)代客戶端應(yīng)用程序體驗(yàn)。.NET MAUI 將比 .NET 6 稍晚發(fā)布。我們在 .NET MAUI 上投入了大量時間和精力,很高興能夠發(fā)布它并看到 .NET MAUI 應(yīng)用程序投入生產(chǎn)。
當(dāng)然,.NET 應(yīng)用程序也可以在家中使用 Windows 桌面(使用 Windows Forms 和WPF)以及使用 ASP.NET Core 在云中。它們是我們提供時間最長的應(yīng)用程序類型,并且仍然非常受歡迎,我們在 .NET 6 中對其進(jìn)行了改進(jìn)。
面向.NET 6
繼續(xù)以廣泛平臺為主題,在所有這些操作系統(tǒng)上編寫 .NET 代碼很容易。
要以 .NET 6 為目標(biāo),您需要使用 .NET 6 目標(biāo)框架,如下所示:
<TargetFramework>net6.0</TargetFramework>net6.0 Target Framework Moniker (TFM) 使您可以訪問 .NET 提供的所有跨平臺 API。如果您正在編寫控制臺應(yīng)用程序、ASP.NET Core 應(yīng)用程序或可重用的跨平臺庫,這是最佳選擇。
如果您針對特定操作系統(tǒng)(例如編寫Windows 窗體或 iOS 應(yīng)用程序),那么還有另一組 TFM(每個都針對不言而喻的操作系統(tǒng))供您使用。它們使您可以訪問所有 net6.0的API以及一堆特定于操作系統(tǒng)的 API。
? net6.0-android
? net6.0-ios
? net6.0-maccatalyst
? net6.0-tvos
? net6.0-windows
每個無版本 TFM 都相當(dāng)于針對 .NET 6 支持的最低操作系統(tǒng)版本。如果您想要具體或訪問更新的 API,可以指定操作系統(tǒng)版本。
net6.0 和 net6.0-windows TFMs 都支持(與 .NET 5 相同)。Android 和 Apple TFM 是 .NET 6 的新功能,目前處于預(yù)覽階段。稍后的 .NET 6 更新將支持它們。
操作系統(tǒng)特定的 TFM 之間沒有兼容性關(guān)系。例如,net6.0-ios 與 net6.0-tvos 不兼容。如果您想共享代碼,您需要使用帶有 #if 語句的源代碼或帶有 net6.0 目標(biāo)代碼的二進(jìn)制文件來實(shí)現(xiàn)。
性能
自從我們啟動 .NET Core 項(xiàng)目以來,該團(tuán)隊(duì)一直在不斷地關(guān)注性能。Stephen Toub 在記錄每個版本的 .NET 性能進(jìn)展方面做得非常出色。歡迎查看在 .NET 6 中的性能改進(jìn)的帖子。在這篇文章中,里面包括您想了解的重大性能改進(jìn),包括文件 IO、接口轉(zhuǎn)換、PGO 和 System.Text.Json。
▌動態(tài)?PGO
動態(tài)輪廓引導(dǎo)優(yōu)化 (PGO)可以顯著提高穩(wěn)態(tài)性能。例如,PGO 為 TechEmpower JSON“MVC”套件的每秒請求數(shù)提高了 26%(510K -> 640K)。
動態(tài) PGO 建立在分層編譯的基礎(chǔ)上,它使方法能夠首先非常快速地編譯(稱為“第 0 層”)以提高啟動性能,然后在啟用大量優(yōu)化的情況下隨后重新編譯(稱為“第 1 層”)一旦該方法被證明是有影響的。該模型使方法能夠在第 0 層中進(jìn)行檢測,以允許對代碼的執(zhí)行進(jìn)行各種觀察。在第 1 層重新調(diào)整這些方法時,從第 0 層執(zhí)行收集的信息用于更好地優(yōu)化第 1 層代碼。這就是機(jī)制的本質(zhì)。
動態(tài) PGO 的啟動時間將比默認(rèn)運(yùn)行時稍慢,因?yàn)樵诘?0 層方法中運(yùn)行了額外的代碼來觀察方法行為。
要啟用動態(tài) PGO,請?jiān)趹?yīng)用程序?qū)⑦\(yùn)行的環(huán)境中設(shè)置 DOTNET_TieredPGO=1。您還必須確保啟用分層編譯(默認(rèn)情況下)。動態(tài) PGO 是可選的,因?yàn)樗且环N新的且有影響力的技術(shù)。我們希望發(fā)布選擇加入使用和相關(guān)反饋,以確保它經(jīng)過全面壓力測試。我們對分層編譯做了同樣的事情。至少一個非常大的 Microsoft 服務(wù)支持并已在生產(chǎn)中使用動態(tài) PGO。我們鼓勵您嘗試一下。
您可以在.NET 6中的性能帖子中看到更多關(guān)于動態(tài) PGO 優(yōu)勢的信息,包括以下微基準(zhǔn),它測量特定 LINQ 枚舉器的成本。
private IEnumerator<long> _source = Enumerable.Range(0, long.MaxValue).GetEnumerator();[Benchmark] public?void?MoveNext()?=>?_source.MoveNext();這是有和沒有動態(tài) PGO 的結(jié)果。
| 方法 | 意思是 | 代碼大小 |
| PGO 已禁用 | 1.905 納秒 | 30乙 |
| 啟用 PGO | 0.7071 納秒 | 105乙 |
這是一個相當(dāng)大的差異,但代碼大小也有所增加,這可能會讓一些讀者感到驚訝。這是由 JIT 生成的匯編代碼的大小,而不是內(nèi)存分配(這是一個更常見的焦點(diǎn))。.NET 6 性能帖子對此有很好的解釋。
PGO 實(shí)現(xiàn)中常見的一種優(yōu)化是“熱/冷分離”,其中經(jīng)常執(zhí)行的方法部分(“熱”)在方法開始時靠近在一起,而不經(jīng)常執(zhí)行的方法部分(“冷”)是移到方法的末尾。這樣可以更好地使用指令緩存,并最大限度地減少可能未使用的代碼負(fù)載。
作為上下文,接口調(diào)度是 .NET 中最昂貴的調(diào)用類型。非虛擬方法調(diào)用是最快的,甚至更快的是可以通過內(nèi)聯(lián)消除的調(diào)用。在這種情況下,動態(tài) PGO 為 MoveNext 提供了兩個(替代)調(diào)用站點(diǎn)。第一個 - 熱的 - 是對 Enumerable+RangeIterator.MoveNext 的直接調(diào)用,另一個 - 冷的 - 是通過 IEnumerator<int> 的虛擬接口調(diào)用。如果大多數(shù)時候最熱門的人都被叫到,那將是一個巨大的勝利。
這就是魔法。當(dāng) JIT 檢測此方法的第 0 層代碼時,包括檢測此接口調(diào)度以跟蹤每次調(diào)用時 _source 的具體類型。JIT 發(fā)現(xiàn)每次調(diào)用都在一個名為 Enumerable+RangeIterator 的類型上,這是一個私有類,用于在 Enumerable 實(shí)現(xiàn)內(nèi)部實(shí)現(xiàn) Enumerable.Range。因此,對于第 1 層,JIT 已發(fā)出檢查以查看 _source 的類型是否為 Enumerable+RangeIterator:如果不是,則跳轉(zhuǎn)到我們之前強(qiáng)調(diào)的執(zhí)行正常接口調(diào)度的冷部分。但如果是 - 基于分析數(shù)據(jù),預(yù)計絕大多數(shù)時間都是這種情況 - 然后它可以繼續(xù)直接調(diào)用非虛擬化的 Enumerable+RangeIterator.MoveNext 方法。不僅如此,它還認(rèn)為內(nèi)聯(lián) MoveNext 方法是有利可圖的。最終效果是生成的匯編代碼有點(diǎn)大,但針對預(yù)期最常見的確切場景進(jìn)行了優(yōu)化。當(dāng)我們開始構(gòu)建動態(tài) PGO 時,這些就是我們想要的那種勝利。
動態(tài) PGO 將在 RyuJIT 部分再次討論。
▌文件 IO 改進(jìn)
FileStream 幾乎完全用 .NET 6 重寫,重點(diǎn)是提高異步文件 IO 性能。在 Windows 上,實(shí)現(xiàn)不再使用阻塞 API,并且可以快幾倍!我們還改進(jìn)了所有平臺上的內(nèi)存使用。在第一次異步操作(通常分配)之后,我們已經(jīng)使異步操作免分配!此外,我們已經(jīng)使 Windows 和 Unix 實(shí)現(xiàn)不同的邊緣情況的行為統(tǒng)一(這是可能的)。
這種重寫的性能改進(jìn)使所有操作系統(tǒng)受益。對 Windows 的好處是最大的,因?yàn)樗h(yuǎn)遠(yuǎn)落后。macOS 和 Linux 用戶也應(yīng)該會看到顯著 FileStream 的性能改進(jìn)。
以下基準(zhǔn)將 100 MB 寫入新文件。
private byte[] _bytes = new byte[8_000];[Benchmark] public async Task Write100MBAsync() {using FileStream fs = new("file.txt", FileMode.Create, FileAccess.Write, FileShare.None, 1, FileOptions.Asynchronous);for (int i = 0; i < 100_000_000 / 8_000; i++)await fs.WriteAsync(_bytes); }在帶有 SSD 驅(qū)動器的 Windows 上,我們觀察到4倍的加速和超過1200倍的分配下降:
| 方法 | 運(yùn)行 | 意思是 | 比率 | 已分配 |
| 寫100MBAsync | .NET 5.0 | 1,308.2 毫秒 | 1.00 | 3,809 KB |
| 寫100MBAsync | .NET 6.0 | 306.8 毫秒 | 0.24 | 3 KB |
我們還認(rèn)識到需要更高性能的文件 IO 功能:并發(fā)讀取和寫入,以及分散/收集 IO。針對這些情況,我們?yōu)?System.IO.File 和 System.IO.RandomAccess 類引入了新的 API。
async Task AllOrNothingAsync(string path, IReadOnlyList<ReadOnlyMemory<byte>> buffers) {using SafeFileHandle handle = File.OpenHandle(path, FileMode.Create, FileAccess.Write, FileShare.None, FileOptions.Asynchronous,preallocationSize: buffers.Sum(buffer => buffer.Length)); // hint for the OS to pre-allocate disk spaceawait RandomAccess.WriteAsync(handle, buffers, fileOffset: 0); // on Linux it's translated to a single sys-call! }該示例演示:
使用新 File.OpenHandle API 打開文件句柄。
使用新的預(yù)分配大小功能預(yù)分配磁盤空間。
使用新的 Scatter/Gather IO API寫入文件。
預(yù)分配大小功能提高了性能,因?yàn)閷懭氩僮鞑恍枰獢U(kuò)展文件,并且文件不太可能被碎片化。這種方法提高了可靠性,因?yàn)閷懭氩僮鲗⒉辉僖蚩臻g不足而失敗,因?yàn)榭臻g已被保留。Scatter/Gather IO API 減少了寫入數(shù)據(jù)所需的系統(tǒng)調(diào)用次數(shù)。
▌更快的接口檢查和轉(zhuǎn)換
界面鑄造性能提高了 16% - 38%。這種改進(jìn)對于 C# 與接口之間的模式匹配特別有用。
這張圖表展示了一個有代表性的基準(zhǔn)測試的改進(jìn)規(guī)模。
將 .NET 運(yùn)行時的一部分從 C++ 遷移到托管 C# 的最大優(yōu)勢之一是它降低了貢獻(xiàn)的障礙。這包括接口轉(zhuǎn)換,它作為早期的 .NET 6 更改移至 C#。.NET 生態(tài)系統(tǒng)中懂 C# 的人比懂 C++ 的人多(而且運(yùn)行時使用具有挑戰(zhàn)性的 C++ 模式)。僅僅能夠閱讀構(gòu)成運(yùn)行時的一些代碼是培養(yǎng)以各種形式做出貢獻(xiàn)的信心的重要一步。
歸功于 Ben Adams。
▌System.Text.Json 源生成器
我們?yōu)?System.Text.Json 添加了一個源代碼生成器,它避免了在運(yùn)行時進(jìn)行反射和代碼生成的需要,并且可以在構(gòu)建時生成最佳序列化代碼。序列化程序通常使用非常保守的技術(shù)編寫,因?yàn)樗鼈儽仨毴绱恕5?#xff0c;如果您閱讀自己的序列化源代碼(使用序列化程序),您可以看到明顯的選擇應(yīng)該是什么,可以使序列化程序在您的特定情況下更加優(yōu)化。這正是這個新的源生成器所做的。
除了提高性能和減少內(nèi)存之外,源代碼生成器還生成最適合裝配修整的代碼。這有助于制作更小的應(yīng)用程序。
序列化POCO是一種非常常見的場景。使用新的源代碼生成器,我們觀察到序列化速度比我們的基準(zhǔn)快 1.6 倍。
| 方法 | 意思是 | 標(biāo)準(zhǔn)差 | 比率 |
| 串行器 | 243.1 納秒 | 9.54 納秒 | 1.00 |
| SrcGenSerializer | 149.3 納秒 | 1.91 納秒 | 0.62 |
TechEmpower 緩存基準(zhǔn)測試平臺或框架對來自數(shù)據(jù)庫的信息進(jìn)行內(nèi)存緩存。基準(zhǔn)測試的 .NET 實(shí)現(xiàn)執(zhí)行緩存數(shù)據(jù)的 JSON 序列化,以便將其作為響應(yīng)發(fā)送到測試工具。
| 請求/秒 | 要求 | |
| net5.0 | 243,000 | 3,669,151 |
| 網(wǎng)6.0 | 260,928 | 3,939,804 |
| net6.0 + JSON 源碼生成 | 364,224 | 5,499,468 |
我們觀察到約 100K RPS 增益(增加約 40%)。與MemoryCache 性能改進(jìn)相結(jié)合時,.NET 6 的吞吐量比 .NET 5 高 50% !
C# 10
歡迎來到 C# 10。C# 10的一個主要主題是繼續(xù)從C# 9中的頂級語句開始的簡化之旅。新功能從 Program.cs 中刪除了更多的儀式,導(dǎo)致程序只有一行。他們的靈感來自于與沒有 C# 經(jīng)驗(yàn)的人(學(xué)生、專業(yè)開發(fā)人員和其他人)交談,并了解什么對他們來說最有效且最直觀。
大多數(shù).NET SDK 模板都已更新,以提供現(xiàn)在可以使用 C# 10 實(shí)現(xiàn)的更簡單、更簡潔的體驗(yàn)。我們收到反饋說,有些人不喜歡新模板,因?yàn)樗鼈儾贿m合專家,刪除面向?qū)ο?#xff0c;刪除在編寫 C# 的第一天學(xué)習(xí)的重要概念,或鼓勵在一個文件中編寫整個程序。客觀地說,這些觀點(diǎn)都不正確。新模型同樣適用于作為專業(yè)開發(fā)人員的學(xué)生。但是,它與 .NET 6 之前的 C 派生模型不同。
C# 10 中還有其他一些功能和改進(jìn),包括記錄結(jié)構(gòu)。
▌全局使用指令
全局 using 指令讓您 using 只需指定一次指令并將其應(yīng)用于您編譯的每個文件。
以下示例顯示了語法的廣度:
? global using System;
? global using static System.Console;
? global using Env = System.Environment;
您可以將global using語句放在任何 .cs 文件中,包括在 Program.cs 中。
隱式 usings 是一個 MSBuild 概念,它會根據(jù) SDK自動添加一組指令。例如,控制臺應(yīng)用程序隱式使用不同于 ASP.NET Core。
隱式使用是可選的,并在 a 中啟用 PropertyGroup:
<ImplicitUsings>enable</ImplicitUsings>隱式使用對于現(xiàn)有項(xiàng)目是可選的,但默認(rèn)包含在新 C# 項(xiàng)目中。有關(guān)詳細(xì)信息,請參閱隱式使用。
▌文件范圍的命名空間
文件范圍的命名空間使您能夠聲明整個文件的命名空間,而無需將剩余內(nèi)容嵌套在{ ... }中. 只允許一個,并且必須在聲明任何類型之前出現(xiàn)。
新語法是單個的一行:
namespace MyNamespace;class MyClass { ... } // Not indented這種新語法是三行縮進(jìn)樣式的替代方案:
namespace MyNamespace {class MyClass { ... } // Everything is indented }好處是在整個文件位于同一個命名空間中的極其常見的情況下減少縮進(jìn)。
▌記錄結(jié)構(gòu)
C# 9 將記錄作為一種特殊的面向值的類形式引入。在 C# 10 中,您還可以聲明結(jié)構(gòu)記錄。C# 中的結(jié)構(gòu)已經(jīng)具有值相等,但記錄結(jié)構(gòu)添加了 == 運(yùn)算符和 IEquatable<T> 的實(shí)現(xiàn),以及基于值的 ToString 實(shí)現(xiàn):
public record struct Person {public string FirstName { get; init; }public string LastName { get; init; } }就像記錄類一樣,記錄結(jié)構(gòu)可以是“位置的”,這意味著它們有一個主構(gòu)造函數(shù),它隱式聲明與參數(shù)對應(yīng)的公共成員:
但是,與記錄類不同,隱式公共成員是可變的自動實(shí)現(xiàn)的屬性。這樣一來,記錄結(jié)構(gòu)就成為了元組的自然成長故事。例如,如果您有一個返回類型(string FirstName, string LastName),并且您希望將其擴(kuò)展為命名類型,您可以輕松地聲明相應(yīng)的位置結(jié)構(gòu)記錄并維護(hù)可變語義。
如果你想要一個具有只讀屬性的不可變記錄,你可以聲明整個記錄結(jié)構(gòu) readonly(就像你可以其他結(jié)構(gòu)一樣):
public readonly record struct Person(string FirstName, string LastName);C# 10 不僅支持記錄結(jié)構(gòu),還支持所有結(jié)構(gòu)以及匿名類型的 with 表達(dá)式:
var updatedPerson = person with { FirstName = "Mary" }F# 6
F# 6旨在讓 F# 更簡單、更高效。這適用于語言設(shè)計、庫和工具。我們對 F# 6(及更高版本)的目標(biāo)是消除語言中讓用戶感到驚訝或阻礙學(xué)習(xí) F# 的極端情況。我們很高興能與 F# 社區(qū)合作進(jìn)行這項(xiàng)持續(xù)的努力。
▌讓 F# 更快、更互操作
新語法task {…}直接創(chuàng)建一個任務(wù)并啟動它。這是 F# 6 中最重要的功能之一,它使異步任務(wù)更簡單、性能更高,并且與 C# 和其他 .NET 語言的互操作性更強(qiáng)。以前,創(chuàng)建 .NET 任務(wù)需要使用async {…}來創(chuàng)建任務(wù)并調(diào)用 Async.StartImmediateAsTask。
該功能 task {…}建立在稱為“可恢復(fù)代碼”RFC FS-1087的基礎(chǔ)之上。可恢復(fù)代碼是一個核心特性,我們希望在未來使用它來構(gòu)建其他高性能異步和屈服狀態(tài)機(jī)。
F# 6 還為庫作者添加了其他性能特性,包括 InlineIfLambda 和F# 活動模式的未裝箱表示。一個特別顯著的性能改進(jìn)在于列表和數(shù)組表達(dá)式的編譯,現(xiàn)在它們的速度提高了4 倍,并且調(diào)試也更好、更簡單。
▌讓 F# 更易學(xué)、更統(tǒng)一
F# 6 啟用expr[idx]索引語法。到目前為止,F# 一直使用 expr.[idx] 進(jìn)行索引。刪除點(diǎn)符號是基于第一次使用 F# 用戶的反復(fù)反饋,點(diǎn)的使用與他們期望的標(biāo)準(zhǔn)實(shí)踐有不必要的差異。在新代碼中,我們建議系統(tǒng)地使用新的 expr[idx]索引語法。作為一個社區(qū),我們都應(yīng)該切換到這種語法。
F# 社區(qū)為使 F# 語言在 F# 6 中更加統(tǒng)一做出了重要改進(jìn)。其中最重要的是消除了 F# 縮進(jìn)規(guī)則中的一些不一致和限制。使 F# 更加統(tǒng)一的其他設(shè)計添加包括添加as圖案;在計算表達(dá)式中允許“重載自定義操作”(對 DSL 有用);允許_丟棄use綁定并允許%B在輸出中進(jìn)行二進(jìn)制格式化。F# 核心庫添加了用于復(fù)制和更新列表、數(shù)組和序列的新函數(shù),以及其他NativePtr內(nèi)在函數(shù)。自 2.0 起棄用的 F# 的一些舊功能現(xiàn)在會導(dǎo)致錯誤。其中許多更改更好地使 F# 與您的期望保持一致,從而減少意外。
F# 6 還增加了對 F# 中其他“隱式”和“類型導(dǎo)向”轉(zhuǎn)換的支持。這意味著更少的顯式向上轉(zhuǎn)換,并為 .NET 樣式的隱式轉(zhuǎn)換添加了一流的支持。F# 也進(jìn)行了調(diào)整,以更好地適應(yīng)使用 64 位整數(shù)的數(shù)字庫時代,并隱式擴(kuò)展了 32 位整數(shù)。
▌改進(jìn) F# 工具
F# 6 中的工具改進(jìn)使日常編碼更容易。新的“管道調(diào)試”允許您單步執(zhí)行、設(shè)置斷點(diǎn)并檢查 F# 管道語法input |> f1 |> f2 的中間值。陰影值的調(diào)試顯示已得到改進(jìn),消除了調(diào)試時常見的混淆源。F# 工具現(xiàn)在也更高效,F# 編譯器并行執(zhí)行解析階段。F# IDE 工具也得到了改進(jìn)。F# 腳本現(xiàn)在更加健壯,允許您通過global.json文件固定使用的 .NET SDK 版本。
熱重載
Hot Reload 是另一個性能特性,專注于開發(fā)人員的生產(chǎn)力。它使您能夠?qū)φ谶\(yùn)行的應(yīng)用程序進(jìn)行各種代碼編輯,從而縮短您等待應(yīng)用程序重新構(gòu)建、重新啟動或重新導(dǎo)航到您在進(jìn)行代碼更改后所在位置所需的時間。
Hot Reload 可通過dotnet watch CLI 工具和 Visual Studio 2022 使用。您可以將 Hot Reload 與多種應(yīng)用類型一起使用,例如 ASP.NET Core、Blazor、.NET MAUI、控制臺、Windows 窗體 (WinForms)、WPF、WinUI 3、Azure 函數(shù)等。
使用 CLI 時,只需使用 啟動您的 .NET 6 應(yīng)用程序dotnet watch,進(jìn)行任何受支持的編輯,然后在保存文件時(如在 Visual Studio Code 中),這些更改將立即應(yīng)用。如果不支持更改,詳細(xì)信息將記錄到命令窗口。
此圖像顯示了一個使用 dotnet watch. 我對.cs文件和.cshtml 文件進(jìn)行了編輯(如日志中所述),兩者都應(yīng)用于代碼并在不到半秒的時間內(nèi)非常快速地反映在瀏覽器中。
使用 Visual Studio 2022 時,只需啟動您的應(yīng)用程序,進(jìn)行支持的更改,然后使用新的“熱重載”按鈕(如下圖所示)應(yīng)用這些更改。您還可以通過同一按鈕上的下拉菜單選擇在保存時應(yīng)用更改。使用 Visual Studio 2022 時,熱重載可用于多個 .NET 版本,適用于 .NET 5+、.NET Core 和 .NET Framework。例如,您將能夠?qū)Π粹o的OnClickEvent 處理程序進(jìn)行代碼隱藏更改。應(yīng)用程序的 Main 方法不支持它。
注意:RuntimeInformation.FrameworkDescription 中存在一個錯誤,該錯誤將在該圖像中展示,很快就會修復(fù)。
Hot Reload 還與現(xiàn)有的 Edit and Continue 功能(在斷點(diǎn)處停止時)以及用于實(shí)時編輯應(yīng)用程序 UI 的 XAML Hot Reload 協(xié)同工作。目前支持 C# 和 Visual Basic 應(yīng)用程序(不是 F#)。
安全
.NET 6 中的安全性得到了顯著改進(jìn)。它始終是團(tuán)隊(duì)關(guān)注的重點(diǎn),包括威脅建模、加密和深度防御防御。
在 Linux 上,我們依賴 OpenSSL 進(jìn)行所有加密操作,包括 TLS(HTTPS 必需)。在 macOS 和 Windows 上,我們依賴操作系統(tǒng)提供的功能來實(shí)現(xiàn)相同的目的。對于每個新版本的 .NET,我們經(jīng)常需要添加對新版本 OpenSSL 的支持。.NET 6 增加了對OpenSSL 3的支持。
OpenSSL 3 的最大變化是改進(jìn)的 FIPS 140-2模塊和更簡單的許可。
.NET 6 需要 OpenSSL 1.1 或更高版本,并且會更喜歡它可以找到的最高安裝版本的 OpenSSL,直到并包括 v3。在一般情況下,當(dāng)您使用的 Linux 發(fā)行版默認(rèn)切換到 OpenSSL 3 時,您最有可能開始使用 OpenSSL 3。大多數(shù)發(fā)行版還沒有這樣做。例如,如果您在 Red Hat 8 或 Ubuntu 20.04 上安裝 .NET 6,您將不會(在撰寫本文時)開始使用 OpenSSL 3。
OpenSSL 3、Windows 10 21H1 和 Windows Server 2022 都支持ChaCha20Poly1305。您可以在 .NET 6 中使用這種新的經(jīng)過身份驗(yàn)證的加密方案(假設(shè)您的環(huán)境支持它)。
感謝 Kevin Jones 對 ChaCha20Poly1305 的 Linux 支持。
我們還發(fā)布了新的運(yùn)行時安全緩解路線圖。重要的是,您使用的運(yùn)行時不受教科書攻擊類型的影響。我們正在滿足這一需求。在 .NET 6 中,我們構(gòu)建了W^X和英特爾控制流強(qiáng)制技術(shù) (CET)的初始實(shí)現(xiàn)。W^X 完全受支持,默認(rèn)為 macOS Arm64 啟用,并且可以選擇加入其他環(huán)境。CET 是所有環(huán)境的選擇加入和預(yù)覽。我們希望在 .NET 7 中的所有環(huán)境中默認(rèn)啟用這兩種技術(shù)。
更多攻略歡迎轉(zhuǎn)到下一篇文章,繼續(xù)閱讀哦!
?了解更多.NET 6?
總結(jié)
以上是生活随笔為你收集整理的.NET 6 攻略大全(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一点杂感 以及 java8 Stream
- 下一篇: 我的技术回顾2019不止技术的一年