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

原文: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 維護信息:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章