.NET 5.0 RC2 釋出,正式版即將在 11 月 .NET Conf 大會上釋出

精緻碼農發表於2020-10-16

原文:http://dwz.win/ThX
作者:Richard
翻譯:精緻碼農-王亮
說明:本譯文捨棄了少許我實在不知道如何翻譯但又不是很重要的語句。

今天(10月13日)我們釋出了 .NET 5.0 候選版本 2(RC2),它是 11 月 .NET 5.0 正式版釋出前的最後一個 RC 版本。RC2 是一個“上線”版本,表示你可以在生產環境中使用它。與此同時,我們正在找尋任何遺漏的關鍵 Bug 報告,這些 Bug 應該在最終釋出前得到修復。

我們今天也釋出了 ASP.NET CoreEF Core 的 RC2 版本。

你可以下載適用於 Windows、macOS 和 Linux 的 .NET 5.0 版本

你需要最新的預覽版 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 示例,以便你可以親自嘗試這些功能。

今天是個大好日子,因為我們將拉開 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 週年紀念日,我們正在努力創造更多的驚喜,值得你的期待。

就像我為 .NET 5.0 Preview 8.NET 5.0 RC1 所做的那樣,我選擇了一些功能來更深入地介紹,並讓你瞭解如何在實際情況中使用它們。這篇文章專門介紹 C# 9 模式匹配、Windows ARM64 和 ClickOnce。

C# 9 模式匹配

模式匹配是在 C# 7.0 中加入的語言特性。不妨讓 Mads 重新介紹一下這個概念,這是他最初介紹這個特性時的說法:

C# 7.0 引入了模式的概念,抽象地說,模式是一種語法元素,它可以測試一個值是否具有一定的“形狀”,當它具有一定的“形狀”時,就從該值中提取資訊。

這是一個非常好的描述,完美的措辭。

C# 團隊在 C# 7、C# 8 和 C# 9 的每個版本中都新增了新的模式。在這篇文章中,你將看到這些語言版本中的每一種模式,但我們將重點關注 C# 9 中的新模式。

C# 9 中的三個新模式是:

  • 關係模式,使用關係運算子,如 <>=
  • 邏輯模式,使用關鍵字 andornot。一個簡短的例子是 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 ParsonsAndy 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

多年來,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 中實現熟悉的 ClickOnce 體驗。
  • 使用 MSBuild 或 Mage 工具,通過命令列流程為 ClickOnce 釋出啟用現代 CI/CD。

用圖片向你展示體驗是最簡單的。

我們先從 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 中得到支援。如果支援其他瀏覽器對你的使用者有多重要,也請告訴我們。

Windows Arm64

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 維護資訊:

相關文章