.NET 5.0 RC 2 發(fā)布,正式版將在 11 月 .NET Conf 大會上發(fā)布
原文:http://dwz.win/ThX
作者:Richard
翻譯:精致碼農(nóng)-王亮
說明:
1. 本譯文舍棄了少許我實在不知道如何翻譯但又不是很重要的語句。
2. 本文有不少超鏈接,由于微信公眾號和頭條平臺外鏈會被剔除 URL 地址,所以原來本是超鏈接的內(nèi)容會顯示為純文本,如果你需要這些信息可以移步到我的知乎和博客園閱讀(搜索“精致碼農(nóng)”可找到我)。
今天(10月13日)我們發(fā)布了 .NET 5.0 候選版本 2(RC2),它是 11 月 .NET 5.0 正式版發(fā)布前的最后一個 RC 版本。RC2 是一個“上線”版本,表示你可以在生產(chǎn)環(huán)境中使用它。與此同時,我們正在找尋任何遺漏的關(guān)鍵 Bug 報告,這些 Bug 應(yīng)該在最終發(fā)布前得到修復(fù)。
我們今天也發(fā)布了 ASP.NET Core 和 EF Core 的 RC2 版本。
你可以下載適用于 Windows、macOS 和 Linux 的 .NET 5.0 版本:
安裝程序和二進制包
容器鏡像
快速安裝程序
發(fā)布說明
已知問題
GitHub Issue 跟蹤
你需要最新的預(yù)覽版 Visual Studio (包括 Visual Studio for Mac) 才能使用 .NET 5.0。
.NET 5.0 包括許多改進,特別是單文件應(yīng)用程序、更小的容器鏡像、功能更強的 JsonSerializer API、一套完整的可空引用類型標(biāo)注、新的Target Framework 名稱,以及對 Windows ARM64 的支持。在 .NET 庫、GC 和 JIT 中,性能得到了極大的提高。我們花了很大的工作在 ARM64 的性能上,它有了更好的吞吐量和更小的二進制文件。.NET 5.0 包含了新的語言版本:C# 9.0 和 F# 5.0。你可以查看一些 .NET 5.0 示例,以便你可以親自嘗試這些功能。
今天是個大好日子,因為我們將拉開 2020 年 .NET@Microsoft 內(nèi)部會議的序幕。屆時將有許多來自 .NET 團隊的演講者,也有來自服務(wù)團隊的開發(fā)人員和架構(gòu)師,他們依靠 .NET 來驅(qū)動微軟云,分享他們的勝利,也分享他們的挑戰(zhàn)。我的演講(不出所料)是“.NET 5.0 中有什么新內(nèi)容”。我的演講將很簡單,會涵蓋我的 .NET 5.0 博文所講到的內(nèi)容!這將是一場精彩的演講。更重要的是,這次會議是我們的機會,讓我們說明為什么微軟團隊?wèi)?yīng)該在 .NET 5.0 發(fā)布后盡快采用它。我所知道的至少有一個大型團隊正在生產(chǎn)中運行 RC1。微軟官方.NET網(wǎng)站 從 Preview 1 開始就一直在運行.NET 5.0,現(xiàn)在正在運行 RC2。本周微軟團隊向我們展示的案例,會與我在所有這些 .NET 5.0 博客文章中向你展示的案例非常相似。.NET 5.0 是一個偉大的版本,它將從根本上改善你的應(yīng)用程序。
說到會議,請記住 .NET Conf 2020 的日期(譯注:11月10日至12日)。今年,.NET 5.0 將在 .NET Conf 2020 上發(fā)布!請來慶祝并了解新版本。我們還將慶祝我們的 10 周年紀(jì)念日,我們正在努力創(chuàng)造更多的驚喜,值得你的期待。
就像我為 .NET 5.0 Preview 8 和 .NET 5.0 RC1 所做的那樣,我選擇了一些功能來更深入地介紹,并讓你了解如何在實際情況中使用它們。這篇文章專門介紹 C# 9 模式匹配、Windows ARM64 和 ClickOnce。
C# 9 模式匹配
模式匹配是在 C# 7.0 中加入的語言特性。不妨讓 Mads 重新介紹一下這個概念,這是他最初介紹這個特性時的說法:
C# 7.0 引入了模式的概念,抽象地說,模式是一種語法元素,它可以測試一個值是否具有一定的“形狀”,當(dāng)它具有一定的“形狀”時,就從該值中提取信息。
這是一個非常好的描述,完美的措辭。
C# 團隊在 C# 7、C# 8 和 C# 9 的每個版本中都添加了新的模式。在這篇文章中,你將看到這些語言版本中的每一種模式,但我們將重點關(guān)注 C# 9 中的新模式。
C# 9 中三個新模式是:
關(guān)系模式,使用關(guān)系運算符,如
<和>=。邏輯模式,使用關(guān)鍵字
and、or、not。一個簡短的例子是foo is not null。當(dāng)你想在一個模式中比較多個事物時,這種類型的模式是最有用的。簡單類型模式,只使用一個類型,而不使用其他語法進行匹配。
我是 BBC 夏洛克系列的忠實粉絲。我寫了一個小程序,可以決定一個給定的角色是否應(yīng)該訪問該系列中的某個內(nèi)容。很簡單,這個應(yīng)用的編寫有兩個限制條件:忠于劇中的時間線和人物,這是一個很好的模式演示。如果有的話,我懷疑我在第二個約束條件上最失敗。在一個特定的應(yīng)用程序中(尤其是這樣一個小應(yīng)用程序),你會發(fā)現(xiàn)一套比人們預(yù)期的更廣泛的模式和風(fēng)格。
當(dāng)我在使用模式時,我有時想做一些與我所熟悉的模式實現(xiàn)稍微不同的事情,但不知道如何擴展該模式來滿足我的目標(biāo)。鑒于這個示例,我希望你能發(fā)現(xiàn)更多的方法,也許你以前不知道這些可以擴展你熟悉的模式的技巧。
應(yīng)用內(nèi)有兩個 switch 表達式,讓我們從兩個中較小的一個開始。
public static bool IsAccessOKAskMycroft(Person person) => person switch
{
// Type pattern
OpenCaseFile f when f.Name == "Jim Moriarty" => true,
// Simple type pattern
Mycroft => true,
_ => false,
};
前兩種模式是類型模式。第一個模式是 C# 8 就支持的。第二種--Mycroft--是新的簡單類型模式的一個例子。在 C# 8 中,這個模式需要一個標(biāo)識符,就像第一個模式一樣,或者至少需要一個棄元,比如 Mycroft _。在 C# 9 中,不再需要標(biāo)識符。是的, Mycroft 是應(yīng)用程序中的一個類型。
在我向你展示另一個 switch 表達式之前,讓我們再簡單一點。下面的 if 語句演示了一個邏輯模式,是兩個使用 is 的類型模式實例。
if (user is Mycroft m && m.CaresAbout is not object)
{
Console.WriteLine("Mycroft dissapoints us again.");
}
這里不知道 user 變量的類型,所以測試它是不是 Mycroft 類型,如果是,則分配給 m。同時判斷 Mycroft 對象上的一個屬性是否是一個 object 類型。
另一種 switch 表達式則要寬泛得多。
public static bool IsAccessOkOfficial(Person user, Content content, int season)
=> (user, content, season) switch
{
// Tuple + property patterns
({Type: Child}, {Type: ChildsPlay}, _) => true,
({Type: Child}, _, _) => false,
(_ , {Type: Public}, _) => true,
({Type: Monarch}, {Type: ForHerEyesOnly}, _) => true,
// Tuple + type patterns
(OpenCaseFile f, {Type: ChildsPlay}, 4) when f.Name == "Sherlock Holmes" => true,
// Property and type patterns
{Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}}
when type == PoorlyDefined && name.Contains("Sherrinford") && season >= 3 => true,
// Tuple and type patterns
(OpenCaseFile, var c, 4) when c.Name.Contains("Sherrinford") => true,
// Tuple, Type, Property and logical patterns
(OpenCaseFile {RiskLevel: >50 and <100 }, {Type: StateSecret}, 3) => true,
_ => false,
};
唯一真正有趣的模式是最后一個模式(在棄元-之前),它測試 Risklevel 是否 >50 且 <100。有很多次我都想用這種形式的邏輯模式語法寫一個 if 語句,而不需要重復(fù)一個變量名。這個邏輯模式也可以用下面的方式來代替,并且會更接近這篇 C# 9 博文中演示的語法,它們是等價的。
(OpenCaseFile {RiskLevel: var riskLevel}, {Type: StateSecret}, 3) when riskLevel switch
{
>50 and <100 => true,
_ => false
}
我遠不是一個語言專家,Jared Parsons 和 Andy Gocke 在本文這一部分給了我很多幫助,謝謝!我的關(guān)鍵絆腳石是一個元組的 switch。有時,位置模式很不方便,你只想使用元組的一部分。這就是屬性模式的作用,你可以在下面的代碼中看到。
{Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}}
when type == PoorlyDefined && name.Contains("Sherrinford") && season >= 3 => true,
這里面有相當(dāng)多的問題。關(guān)鍵的一點是,這里測試的是元組屬性,而不是按位置匹配元組。這種方法提供了更多的靈活性。你可以在一個給定的 switch 表達式中自由地混合這些方法。希望這能幫助一些人,至少對我有幫助。
如果你對這個應(yīng)用的功能很好奇,我已經(jīng)把程序的輸出保存在 app gist 中。你也可以自己運行這個程序。它需要 .NET 5.0 RC2 才能運行。
ClickOnce
多年來,ClickOnce 一直是一個流行的 .NET 部署選項。現(xiàn)在它已支持為 .NET Core 3.1 和 .NET 5.0 Windows 應(yīng)用程序。當(dāng)我們在 .NET Core 3.0 中添加了 Windows Forms 和 WPF 支持時,我們就知道很多人會希望使用 ClickOnce 來部署應(yīng)用程序。在過去的一年里,.NET 和 Visual Studio 團隊共同合作,在命令行和 Visual Studio 中啟用了 ClickOnce 發(fā)布。
我們從項目一開始就有兩個目標(biāo):
在 Visual Studio 中實現(xiàn)熟悉的 ClickOnce 體驗。
使用 MSBuild 或 Mage 工具,通過命令行流程為 ClickOnce 發(fā)布啟用現(xiàn)代 CI/CD。
用圖片向你展示體驗是最簡單的。
我們先從 Visual Studio 的體驗開始,它是以項目發(fā)布為中心的。

我們目前支持的主要部署模式是框架依賴型應(yīng)用。很容易采取依賴 .NET 桌面運行時(就是包含 WPF 和 Windows Forms 的那個)。如果需要的話,你的 ClickOnce 安裝程序?qū)⒃谟脩魴C器上安裝 .NET 運行時。我們還打算支持獨立的和單文件的應(yīng)用程序。

你可能會想知道,你是否還能利用 ClickOnce 的離線和更新功能。是的,你可以。

包括相同的安裝位置和清單簽署功能。如果你有嚴(yán)格的簽名要求,你會喜歡上這個新的體驗。
現(xiàn)在,讓我們切換到 Mage 的命令行體驗。
Mage 最大的變化是,它現(xiàn)在是一個 .NET 工具,發(fā)布在 NuGet 上。這意味著你不需要在你的機器上安裝任何特殊的東西。你只需要 .NET 5.0 SDK,然后你就可以把 Mage 作為一個 .NET 工具來安裝。你也可以用它來發(fā)布 .NET 框架的應(yīng)用程序,不過,SHA1 簽名和部分信任支持已經(jīng)被移除。
Mage 的安裝命令如下:
dotnet tool install -g Microsoft.DotNet.Mage
用以下命令配置并發(fā)布示例應(yīng)用程序:

下面一條命令將啟動ClickOnce應(yīng)用程序:

然后出現(xiàn)熟悉的 ClickOnce 安裝對話框:

安裝應(yīng)用后,會啟動應(yīng)用:

重新構(gòu)建并重新發(fā)布應(yīng)用程序后,用戶將看到一個更新對話框:

更新后的應(yīng)用程序?qū)⒈粏印?br>
注意:Mage .NET 工具的名稱將從 mage.net 改為 dotnet-mage,NuGet 包名將保持不變。
這個圍繞 ClickOnce 發(fā)布和安裝的快速指南應(yīng)該會讓你對如何使用 ClickOnce 有一個好的認(rèn)識。我們的意圖是與使用現(xiàn)有 .NET 框架的 ClickOnce 支持有一樣的體驗。如果你發(fā)現(xiàn)我們沒有達到這個目標(biāo),請告訴我們。
ClickOnce 瀏覽器集成與 .NET Framework 相同,在 Edge 和 Internet Explorer 中得到支持。如果支持其他瀏覽器對你的用戶有多重要,也請告訴我們。
Windows Arm64
MSI 安裝程序現(xiàn)在可以用于 Windows Arm64,你可以從下面的 .NET 5.0 SDK 安裝程序圖片中看到。

為了進一步證明這一點,我在 Arm64 機器上運行 dotnet-runtimeinfo 工具來演示配置。
C:\Users\rich>dotnet tool install -g dotnet-runtimeinfo
You can invoke the tool using the following command: dotnet-runtimeinfo
Tool 'dotnet-runtimeinfo' (version '1.0.2') was successfully installed.
C:\Users\rich>dotnet-runtimeinfo
**.NET information
Version: 5.0.0
FrameworkDescription: .NET 5.0.0-rc.2.20475.5
Libraries version: 5.0.0-rc.2.20475.5
Libraries hash: c5a3f49c88d3d907a56ec8d18f783426de5144e9
**Environment information
OSDescription: Microsoft Windows 10.0.18362
OSVersion: Microsoft Windows NT 10.0.18362.0
OSArchitecture: Arm64
ProcessorCount: 8
.NET 5.0 SDK 目前不包含 Windows Arm64 上的 Windows 桌面組件--Windows Forms 和 WPF。這一遲來的變化最初是在 .NET 5.0 Preview 8 的帖子中分享的。我們希望在 5.0 服務(wù)更新中為 Windows Arm64 添加 Windows 桌面包,我們目前還沒有確定具體的日期。目前,Windows Arm64 上支持 SDK、控制臺和 ASP .NET Core 應(yīng)用程序。
結(jié)束
我們現(xiàn)在非常接近完成 5.0 這個版本,并已將其傳遞出去以供廣泛的生產(chǎn)使用。我們相信它已經(jīng)準(zhǔn)備好了。它在微軟的生產(chǎn)環(huán)境中使用,已經(jīng)給我們帶來了很大的信心。我們期待你有機會在自己的環(huán)境中真正使用 .NET 5.0。
我們已經(jīng)很久沒有分享我們的社交媒體了,敬請關(guān)注我們的 dotnet 維護信息:
Twitter
Facebook
資源分享
謝謝您的支持,需要任何資源,只需要在公眾號后臺回復(fù)對應(yīng)數(shù)字即可:
01:dotnet
02:java
03:android
04:C++
05:qt
06:react
沒有的資源或資源鏈接失效,請給我留言或加我微信。
另:大部分資源可在我的網(wǎng)站搜索哦:https://dotnet9.com
