原文:http://dwz.win/ThX
做者:Richard
翻譯:精緻碼農-王亮
說明:本譯文捨棄了少量我實在不知道如何翻譯但又不是很重要的語句。git
今天(10月13日)咱們發佈了 .NET 5.0 候選版本 2(RC2),它是 11 月 .NET 5.0 正式版發佈前的最後一個 RC 版本。RC2 是一個「上線」版本,表示你能夠在生產環境中使用它。與此同時,咱們正在找尋任何遺漏的關鍵 Bug 報告,這些 Bug 應該在最終發佈前獲得修復。github
咱們今天也發佈了 ASP.NET Core 和 EF Core 的 RC2 版本。docker
你能夠下載適用於 Windows、macOS 和 Linux 的 .NET 5.0 版本:shell
你須要最新的預覽版 Visual Studio (包括 Visual Studio for Mac) 才能使用 .NET 5.0。小程序
.NET 5.0 包括許多改進,特別是單文件應用程序、更小的容器鏡像、功能更強的 JsonSerializer API、一套完整的可空引用類型標註、新的Target Framework 名稱,以及對 Windows ARM64 的支持。在 .NET 庫、GC 和 JIT 中,性能獲得了極大的提升。咱們花了很大的工做在 ARM64 的性能上,它有了更好的吞吐量和更小的二進制文件。.NET 5.0 包含了新的語言版本:C# 9.0 和 F# 5.0。你能夠查看一些 .NET 5.0 示例,以便你能夠親自嘗試這些功能。windows
今天是個大好日子,由於咱們將拉開 2020 年 .NET@Microsoft 內部會議的序幕。屆時將有許多來自 .NET 團隊的演講者,也有來自服務團隊的開發人員和架構師,他們依靠 .NET 來驅動微軟雲,分享他們的勝利,也分享他們的挑戰。個人演講(不出所料)是「.NET 5.0 中有什麼新內容」。個人演講將很簡單,會涵蓋個人 .NET 5.0 博文所講到的內容!這將是一場精彩的演講。更重要的是,此次會議是咱們的機會,讓咱們說明爲何微軟團隊應該在 .NET 5.0 發佈後儘快採用它。我所知道的至少有一個大型團隊正在生產中運行 RC1。微軟官方.NET網站 從 Preview 1 開始就一直在運行.NET 5.0,如今正在運行 RC2。本週微軟團隊向咱們展現的案例,會與我在全部這些 .NET 5.0 博客文章中向你展現的案例很是類似。.NET 5.0 是一個偉大的版本,它將從根本上改善你的應用程序。瀏覽器
說到會議,請記住 .NET Conf 2020 的日期(譯註:11月10日至12日)。今年,.NET 5.0 將在 .NET Conf 2020 上發佈!請來慶祝並瞭解新版本。咱們還將慶祝咱們的 10 週年記念日,咱們正在努力創造更多的驚喜,值得你的期待。bash
就像我爲 .NET 5.0 Preview 8 和 .NET 5.0 RC1 所作的那樣,我選擇了一些功能來更深刻地介紹,並讓你瞭解如何在實際狀況中使用它們。這篇文章專門介紹 C# 9 模式匹配、Windows ARM64 和 ClickOnce。架構
模式匹配是在 C# 7.0 中加入的語言特性。不妨讓 Mads 從新介紹一下這個概念,這是他最初介紹這個特性時的說法:併發
C# 7.0 引入了模式的概念,抽象地說,模式是一種語法元素,它能夠測試一個值是否具備必定的「形狀」,當它具備必定的「形狀」時,就從該值中提取信息。
這是一個很是好的描述,完美的措辭。
C# 團隊在 C# 七、C# 8 和 C# 9 的每一個版本中都添加了新的模式。在這篇文章中,你將看到這些語言版本中的每一種模式,但咱們將重點關注 C# 9 中的新模式。
C# 9 中的三個新模式是:
<
和 >=
。and
、or
、not
。一個簡短的例子是 foo is not null
。當你想在一個模式中比較多個事物時,這種類型的模式是最有用的。我是 BBC 夏洛克系列的忠實粉絲。我寫了一個小程序,能夠決定一個給定的角色是否應該訪問該系列中的某個內容。很簡單,這個應用的編寫有兩個限制條件:忠於劇中的時間線和人物,這是一個很好的模式演示。若是有的話,我懷疑我在第二個約束條件上最失敗。在一個特定的應用程序中(尤爲是這樣一個小應用程序),你會發現一套比人們預期的更普遍的模式和風格。
當我在使用模式時,我有時想作一些與我所熟悉的模式實現稍微不一樣的事情,但不知道如何擴展該模式來知足個人目標。鑑於這個示例,我但願你能發現更多的方法,也許你之前不知道這些能夠擴展你熟悉的模式的技巧。
應用內有兩個 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 中,這個模式須要一個標識符,就像第一個模式同樣,或者至少須要一個棄元,好比 Mycroft _
。在 C# 9 中,再也不須要標識符。是的, Mycroft
是應用程序中的一個類型。
在我向你展現另外一個 switch 表達式以前,讓咱們再簡單一點。下面的 if
語句演示了一個邏輯模式,是兩個使用 is
的類型模式實例。
if (user is Mycroft m && m.CaresAbout is not object) { Console.WriteLine("Mycroft dissapoints us again."); }
這裏不知道 user
變量的類型,因此測試它是否是 Mycroft
類型,若是是,則分配給 m
。同時判斷 Mycroft
對象上的一個屬性是不是一個 object 類型。這裏是爲了演示邏輯模式 not 的使用,其實用 is null
是同樣的效果。
另外一種 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 語句,而不須要重複一個變量名。這個邏輯模式也能夠用下面的方式來代替,而且會更接近這篇 C# 9 博文中演示的語法,它們是等價的。
(OpenCaseFile {RiskLevel: var riskLevel}, {Type: StateSecret}, 3) when riskLevel switch { >50 and <100 => true, _ => false }
我遠不是一個語言專家,Jared Parsons 和 Andy Gocke 在本文這一部分給了我不少幫助,謝謝!個人關鍵絆腳石是一個元組的 switch。有時,位置模式很不方便,你只想使用元組的一部分。這就是屬性模式的做用,你能夠在下面的代碼中看到。
{Item1: OpenCaseFile {Type: var type}, Item2: {Name: var name}} when type == PoorlyDefined && name.Contains("Sherrinford") && season >= 3 => true,
這裏面有至關多的問題。關鍵的一點是,這裏測試的是元組屬性,而不是按位置匹配元組。這種方法提供了更多的靈活性。你能夠在一個給定的 switch 表達式中自由地混合這些方法。但願這能幫助一些人,至少對我有幫助。
若是你對這個應用的功能很好奇,我已經把程序的輸出保存在 app gist 中。你也能夠本身運行這個程序。它須要 .NET 5.0 RC2 才能運行。
多年來,ClickOnce 一直是一個流行的 .NET 部署選項。如今它已支持爲 .NET Core 3.1 和 .NET 5.0 Windows 應用程序。當咱們在 .NET Core 3.0 中添加了 Windows Forms 和 WPF 支持時,咱們就知道不少人會但願使用 ClickOnce 來部署應用程序。在過去的一年裏,.NET 和 Visual Studio 團隊共同合做,在命令行和 Visual Studio 中啓用了 ClickOnce 發佈。
咱們從項目一開始就有兩個目標:
用圖片向你展現體驗是最簡單的。
咱們先從 Visual Studio 的體驗開始,它是以項目發佈爲中心的。
咱們目前支持的主要部署模式是框架依賴型應用。很容易採起依賴 .NET 桌面運行時(就是包含 WPF 和 Windows Forms 的那個)。若是須要的話,你的 ClickOnce 安裝程序將在用戶機器上安裝 .NET 運行時。咱們還打算支持獨立的和單文件的應用程序。
你可能會想知道,你是否還能利用 ClickOnce 的離線和更新功能。是的,你能夠。
包括相同的安裝位置和清單簽署功能。若是你有嚴格的簽名要求,你會喜歡上這個新的體驗。
如今,讓咱們切換到 Mage 的命令行體驗。
Mage 最大的變化是,它如今是一個 .NET 工具,發佈在 NuGet 上。這意味着你不須要在你的機器上安裝任何特殊的東西。你只須要 .NET 5.0 SDK,而後你就能夠把 Mage 做爲一個 .NET 工具來安裝。你也能夠用它來發布 .NET 框架的應用程序,不過,SHA1 簽名和部分信任支持已經被移除。
Mage 的安裝命令以下:
dotnet tool install -g Microsoft.DotNet.Mage
用如下命令配置併發布示例應用程序:
下面一條命令將啓動ClickOnce應用程序:
而後出現熟悉的 ClickOnce 安裝對話框:
安裝應用後,會啓動應用:
從新構建並從新發布應用程序後,用戶將看到一個更新對話框:
更新後的應用程序將被啓動。
注意:Mage .NET 工具的名稱將從 mage.net
改成 dotnet-mage
,NuGet 包名將保持不變。
這個圍繞 ClickOnce 發佈和安裝的快速指南應該會讓你對如何使用 ClickOnce 有一個好的認識。咱們的意圖是與使用現有 .NET 框架的 ClickOnce 支持有同樣的體驗。若是你發現咱們沒有達到這個目標,請告訴咱們。
ClickOnce 瀏覽器集成與 .NET Framework 相同,在 Edge 和 Internet Explorer 中獲得支持。若是支持其餘瀏覽器對你的用戶有多重要,也請告訴咱們。
MSI 安裝程序如今能夠用於 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 服務更新中爲 Windows Arm64 添加 Windows 桌面包,咱們目前尚未肯定具體的日期。目前,Windows Arm64 上支持 SDK、控制檯和 ASP .NET Core 應用程序。
咱們如今很是接近完成 5.0 這個版本,並已將其傳遞出去以供普遍的生產使用。咱們相信它已經準備好了。它在微軟的生產環境中使用,已經給咱們帶來了很大的信心。咱們期待你有機會在本身的環境中真正使用 .NET 5.0。
咱們已經好久沒有分享咱們的社交媒體了,敬請關注咱們的 dotnet 維護信息: