.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 Core 和 EF 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 中的三个新模式是:
- 关系模式,使用关系运算符,如
<
和>=
。 - 逻辑模式,使用关键字
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
多年来,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 维护信息:
.NET 5.0 RC2 发布,正式版即将在 11 月 .NET Conf 大会上发布的更多相关文章
- Java 开源博客——B3log Solo 0.6.1 正式版发布了!
Java 开源博客 —— B3LOG Solo 0.6.1 正式版发布了!欢迎大家下载. 该版本主要是改善细节体验,并加入了一款 Metro 风格的皮肤. 特性 基于标签的文章分类 Ping Goog ...
- Java 开源博客 —— Solo 0.6.8 正式版发布了!
Java 开源博客 -- Solo 0.6.8 正式版发布了,欢迎大家下载.另外,欢迎观摩我们的另一个产品,在线 Golang IDE--Wide! 特性 基于标签的文章分类 博客/标签 Atom/R ...
- Java 开源博客——B3log Solo 0.6.7 正式版发布了!
Java 开源博客 -- B3log Solo 0.6.7 正式版发布了!欢迎大家下载. 另外,欢迎观摩 B3log 团队的新项目:Wide,也非常欢迎大家参与进来 :-) 特性 基于标签的文章分类 ...
- Java 开源博客——B3log Solo 0.6.6 正式版发布了!
Java 开源博客 -- B3log Solo 0.6.6 正式版发布了!欢迎大家下载. 该版本引入了数据库连接池:Druid. 另外,欢迎观摩 B3log 团队的新项目:Noty,也非常欢迎大家参与 ...
- Java 开源博客——B3log Solo 0.6.5 正式版发布了!
Java 开源博客 -- B3log Solo 0.6.5 正式版发布了!欢迎大家下载. 该版本主要是改善细节体验,也是 B3log Solo 的最后一个大版本. 这个版本发布后,B3log Solo ...
- Visual Studio 2013 发布正式版
SELECT COUNT(1) 和SELECT COUNT(*)哪个性能好? Visual Studio 2013 发布正式版及使用感受 (注意:文末我添加了一个小节,用来更新最新的一些使用感受.) ...
- 微软发布了Visual Studio 2022 RC版,并将在11月8日发布正式版
微软今天发布了Visual Studio 2022 最接近正式发布的RC版本,同时宣布在11月8日发布正式版,届时将在线上发布虚拟的发布活动,具体参见:https://devblogs.microso ...
- Java 开源博客——B3log Solo 0.6.6 正式版公布了!
Java 开源博客 -- B3log Solo 0.6.6 正式版公布了!欢迎大家下载. 该版本号引入了数据库连接池:Druid. 另外,欢迎观摩 B3log 团队的新项目:Noty,也很欢迎大家參与 ...
- Java 开源博客——B3log Solo 0.6.7 正式版公布了!
Java 开源博客 -- B3log Solo 0.6.7 正式版公布了!欢迎大家下载. 另外,欢迎观摩 B3log 团队的新项目:Wide,也很欢迎大家參与进来 :-) 特性 基于标签的文章分类 P ...
随机推荐
- poi自动生成Ecxel表格和Chart图表
最近因为业务需求,需要做poi自动导出Ecxel表格和Chart折线图的功能. 所以我在网上找到了一篇关于poi生成Chart图表的博客,代码很详细,但是缺少相关注释说明. 想要将它改造成自己需要的样 ...
- python3 while循环
python不支持n++这样格式,因为python中变量不像c那样事先定义好变量类型,在内存中开辟指定的空间,然后赋值. python中以字符串为例,事先在内存划分空间来存放字符串,然后用变量名来指向 ...
- [LeetCode] 22. 括号生成(回溯/DP)
题目 给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合. 例如,给出 n = 3,生成结果为: [ "((()))", "(()( ...
- [Java并发编程之美]第2章 synchroized关键字
###synchronized关键字 synchronized块是Java提供的一种原子性内置锁,每个对象都可以把它当同步锁来用.线程在进入synchronized块钱会自动获取内部锁,这时候其他线程 ...
- Bootstrap学习第一天
听说bootstrap很火,页面做的非常好看,今天我决定开始学习bootstrap. bootstrap是一种响应式前端技术,可以用于构建适应多种设备的网站页面,当页面尺寸变化时会根据变化的尺寸适应设 ...
- Axios源码深度剖析
Axios源码深度剖析 - XHR篇 axios 是一个基于 Promise 的http请求库,可以用在浏览器和node.js中,目前在github上有 42K 的star数 分析axios - 目录 ...
- linux之磁盘整理
yum安装的时候报错没有磁盘空间,需要整理 就需要查看下目前的磁盘使用情况 首先是df -hl查看从磁盘使用 可以到根目录下看看文件夹大小 du -sh * 或者下面的命令 接下来我们要删除东西整理磁 ...
- Redis中LIST列表的相关命令
Redis中LIST列表的相关命令 添加 lpush 将一个或多个value插入到key的表头,如果存在多个value,那么各个value按从左到右的顺序依次插入表头 插入表头:意味着新插入的值在最前 ...
- Redis学习(五)Redis知识点总结
一.基础概念 Q:什么是 Redis? 定义:Redis 是完全开源免费基于内存亦可持久化的,遵守 BSD 协议,是一个高性能的 key-value 数据库. 特点: 数据的持久化 :可以将内存中的数 ...
- KONGA下的HAMC插件功能 --JAVA代码实现
设置HAMC插件 postman模拟请发发送: Java代码: HMAC-SHA-256工具类 1 import java.security.InvalidKeyException; 2 impor ...