.NET 5.0 RC 2 发布,正式版将在 11 月 .NET Conf 大会上发布

原文:http://dwz.win/ThX
作者:Richard
翻译:精致码农-王亮
说明:
1. 本译文舍弃了少许我实在不知道如何翻译但又不是很重要的语句。
2. 本文有不少超链接,由于微信公众号和头条平台外链会被剔除 URL 地址,所以原来本是超链接的内容会显示为纯文本,如果你需要这些信息可以移步到我的知乎和博客园阅读(搜索“精致码农”可找到我)。

今天(10月13日)我们发布了 .NET 5.0 候选版本 2(RC2),它是 11 月 .NET 5.0 正式版发布前的最后一个 RC 版本。RC2 是一个“上线”版本,表示你可以在生产环境中使用它。与此同时,我们正在找寻任何遗漏的关键 Bug 报告,这些 Bug 应该在最终发布前得到修复。

我们今天也发布了 ASP.NET Core 和 EF Core 的 RC2 版本。

你可以下载适用于 Windows、macOS 和 Linux 的 .NET 5.0 版本:

  • 安装程序和二进制包

  • 容器镜像

  • 快速安装程序

  • 发布说明

  • 已知问题

  • GitHub Issue 跟踪

你需要最新的预览版 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 patternOpenCaseFile f when f.Name == "Jim Moriarty"    => true,// Simple type patternMycroft                                         => 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 类型。

另一种 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

多年来,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 维护信息:

  • Twitter

  • Facebook

-

精致码农

带你洞悉编程与架构

↑长按图片识别二维码关注,不要错过网海相遇的缘分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode216. 组合总和 III

一:题目 二:上码 class Solution {/**递归深度根据k值确定,宽度的话那就[1,9]因为递归不允许重复&#xff0c;那么的话我们需要每次在横向遍历的起始位置1*/private List<List<Integer>> ans new ArrayList<>();private List<Integer> path new Arr…

BeetleX之Websocket协议分析详解

Websocket应用协议已经普及多年了&#xff0c;它是HTTP1.1的内部升级协议&#xff0c;主要作用是补充HTTP1.1无法灵活地主动推送消息给客户端的缺陷问题。在这里主要介绍一下使用组件如何扩展一个完整的Websocket协议。协议介绍Websocket并不复杂&#xff0c;但协议文档内容还是…

甲骨文是否可以要求 Java API 享有版权?这场10年官司怎么结

美国最高法院10月7日就 Oracle 甲骨文诉 Google 谷歌一案进行口头辩论。案件一直以来争议的核心是&#xff0c;甲骨文是否可以要求 Java API 享有版权&#xff0c;如果可以&#xff0c;那么谷歌是否侵犯了这些版权&#xff1f;Java API 是否可以享有版权&#xff1f;Sun 公司在…

C#知多少 | 每个版本都更新了什么?

总所周知&#xff0c;.NET5.0马上就要来了&#xff0c;最后一个预览版RC2也已经发布了&#xff0c;在11月的时候&#xff0c;我们就正式的发布了&#xff0c;然后我们就可以迁移使用了&#xff0c;当然今天说的重点不是.NET&#xff0c;今天说的是伴随着.NET5一起到来的C#9.0&a…

leetcode40. 组合总和 II(树层去重)

一:题目 二:上码 class Solution {/**注意这里的去重:1.我们分为树层去重比如[1,1 2,5] target 8,那么如果我们用树枝去重的话,那么就会出现[1,2,5],[1,2,5]那么的话我们就需要树层去重 就是横向遇见相同的元素跳过。2.树枝去重的 树枝去重就是 我们数组前面使用过的元素不…

WPF开源控件扩展库 - MaterialDesignExtensions

WPF开源控件扩展库 - MaterialDesignExtensionsMaterialDesignExtensions仓库截图logoMaterial Design Extensions 在WPF开源控件库 ????Material Design in XAML Toolkit(本站介绍&#xff1a;????链接)的基础上进行了控件扩展和特性新增。本开源项目中的控件或许不在…

leetcode131. 分割回文串

一:题目 二:上码 class Solution {/**思路:1.纵向递归的话 我们递归深度是 我们的 切割线切到了最后 2.横向for 我们的宽度就是字符串宽度3.在哪截取的话 那就是在哪个坐标的后面*/List<List<String>> ans new ArrayList<>();List<String> path n…

WordPress 已过时?创始人与新架构拥护者开战

喜欢就关注我们吧&#xff01;近日&#xff0c;WordPress 创始人 Matt Mullenweg 与 Netlify 首席执行官 Matt Biilmann 展开了一场口水战&#xff0c;双方就 WordPress 与新兴 WEB 应用架构 JAMStack 孰优孰劣进行了激烈的辩论。何为 JAMStack?JAMStack 是一种将 Web 应用部署…

leetcode93. 复原 IP 地址(思路+详解)

一:题目 二:上码 class Solution {/**思路: 1.跟分割字符串差不多,但是我们需要记录添加的.的个数 当其个数等于3的时候 我们就已经切割成4段了。2.判断字符是否合法1>:以0开头的数字不合法2>:遇见非数字字符不合法3>:大于255不合法*/private List<String> an…

今天的你,又被带节奏了吗?

这是头哥侃码的第220篇原创十一期间&#xff0c;我在某微信群看到几个哥们在讨论 与「带节奏」有关的话题。很显然&#xff0c;像这种略带吐槽的的话题是很容易引起共鸣的。于是你一句他一句的&#xff0c;用自带表情包的方式开始说起了「带节奏」的各种操作。先是A君&#xff…

谷歌最终还是把Knative交了出来

谷歌方面正计划将其开源 Knative 项目的直接控制权让渡给一个指导委员会。Knative 是谷歌开源的一套 Serverless 架构方案&#xff0c;它扩展了 Kubernetes&#xff0c;专注于解决容器为核心的 Serverless 应用的构建、部署和运行的问题&#xff0c;它构建在 Kubernetes 和 Ist…

你那么普通 所以一定要自信啊

你这么普通&#xff0c;必须自信啊 ​ 昨天讲到&#xff0c;不管你准没准备好&#xff0c;该来的都来了。只要你进入了社会&#xff0c;这一切都没得选&#xff0c;好的坏的甭管啥事&#xff0c;都一股脑摆在你面前&#xff0c;你必须要处理。你说我不行啊&#xff0c;我做不到…

leetcode293周赛6064. 不含特殊楼层的最大连续楼层数

一:题目 二:上码 // class Solution { // public:// bool find(vector<int>& v,int i) { // for (auto nums:v) { // if (nums i) return true;//包含某个数 就返回true // } // return false; // }// int maxCon…

leetcode293周赛5234. 移除字母异位词后的结果数组

一:题目 二:上码 class Solution { public:/**1.所谓字母异位词就是相同的字母组成的字符串&#xff08;这个字符串可以相同&#xff09;2.首先判断两个字符串中的字母是否相同用map进行计数&#xff0c;然后在另一个字符串中查找某个字符进行--;3.如果最终的map中所有的value…

七国要求科技巨头预留后门 应对马甲芯片高度警惕

日前&#xff0c;美国、英国、日本、澳大利亚、加拿大、新西兰、印度呼吁科技公司设计产品时确保政府可以访问经过加密的消息和内容。其实&#xff0c;西方科技公司配合西方政府在产品中预留后门早已不是新鲜事&#xff0c;斯诺登就曾经爆料多个美国科技巨头配合美国情报部门收…

leetcode78. 子集

一:题目 二:上码 class Solution {/**横向递归的是:我们子集的长度纵向递归的是:我们子集的中元素的更改*/List<List<Integer>> ans new ArrayList<>();List<Integer> path new ArrayList<>();public void getAns(int[] nums,int st) {ans.ad…

跟我一起学Redis之看完这篇比常人多会三种类型实战(又搞了几个小时)

前言对于Redis而言&#xff0c;很多小伙伴只关注其关键的五大基础类型&#xff1a;string、hash、list、set、sorted set(有序集合)&#xff0c;其实还有三种特殊类型在很多应用场景也比较适合使用&#xff0c;分别是&#xff1a;bitmap、geospatial、hyperloglog&#xff1b;上…

leetcode90. 子集 II(树层去重)

一:题目 二:上码 class Solution {/**- 先排序- 树层去重:那么直接在从横向循环中去重即可*/List<List<Integer>> ans new ArrayList<>();List<Integer> path new ArrayList<>();public void getAns(int[] nums,int st) {ans.add(new ArrayLi…

Rancher 2.5 正式发布,多项重大更新来袭!

喜欢就关注我们吧&#xff01;近日&#xff0c;Kubernetes 管理平台 Rancher 2.5 正式发布&#xff0c;官方公布了在 Rancher 2.5 中的多项重大更新&#xff0c;包括全新的安装体验、针对边缘集群的大规模 GitOps 以及 EKS 集群的全生命周期管理。具体更新信息如下&#xff1a;…

leetcode491. 递增子序列(树层去重魔改版)

一:题目 二:上码 class Solution {/**思路:1.这里已经指明了不允许有重复的&#xff0c;那么树层去重 树枝去重(以前用过的元素不再使用)2.坑:这里不能用 传统的树层去重了 因为我们无法排序了3.这里给出的解决办法是 是利用 hashmap,对每个数出现的频率进行统计如果其频率…