.NET 5 的新变化
.NET 5 是继 3.1 之后 .NET Core 的下一个主要版本。 出于以下两个原因,我们将此新版本命名为 .NET 5,而不是 .NET Core 4:
- 我们跳过了版本编号 4.x,以避免与 .NET Framework 4.x 混淆。
- 我们从名称中删除了“Core”,是为了强调这是 .NET 未来的主要实现。 与 .NET Core 或 .NET Framework 相比,.NET 5 会支持类型更多的应用和平台。
ASP.NET Core 5.0 虽以 .NET 5 为基础,但保留了名称“Core”以避免与 ASP.NET MVC 5 混淆。 同理,Entity Framework Core 5.0 保留了名称“Core”,以避免与 Entity Framework 5 和 Entity Framework 6 混淆。
与 .NET Core 3.1 相比,.NET 5 包含以下改进和新功能:
- C# 更新
- F# 更新
- Visual Basic 更新
- System.Text.Json 新功能
- 单一文件应用
- 应用剪裁
- Windows Arm64 和 Arm64 内部函数
- 转储调试的工具支持
- 对于可以为 null 的引用类型,运行时库的批注百分比为 80%
- 性能改进:
.NET 5 不会替换 .NET Framework
.NET 5 及更高版本是 .NET 未来的主要实现,但 .NET Framework 4.x 仍受支持。 目前没有计划将以下技术从 .NET Framework 移植到 .NET 5,但 .NET 中有一些替代项:
技术 | 建议使用的替代项 |
---|---|
Web 窗体 | ASP.NET Core Razor 或 Razor Pages |
Windows 工作流 (WF) | Elsa-Workflows |
Windows Communication Foundation
Windows Communication Foundation (WCF) 的原始实现仅在 Windows 上受支持。 但是,.NET Foundation 中提供了一个客户端端口。 它是完全开源且跨平台的,由 Microsoft 提供支持。 下面列出了核心 NuGet 包:
- System.ServiceModel.Duplex
- System.ServiceModel.Federation
- System.ServiceModel.Http
- System.ServiceModel.NetTcp
- System.ServiceModel.Primitives
- System.ServiceModel.Security
补充前述的客户端库的服务器组件可通过 CoreWCF 获取。 自 2022 年 4 月起,CoreWCF 正式获得 Microsoft 的支持。 但是,对于 WCF 的替代项,请考虑 gRPC。
.NET 5 不会替代 .NET Standard
新的应用程序开发可为所有项目类型(包括类库)指定 net5.0
目标框架名字对象 (TFM)。 在 .NET 5 工作负载之间共享代码得到了简化,因为你只需要 net5.0
TFM。
对于 .NET 5 应用和库,net5.0
TFM 合并和替换了 netcoreapp
和 netstandard
TFM。 但是,如果你计划在 .NET Framework、.NET Core 和 .NET 5 工作负载之间共享代码,可以通过将 netstandard2.0
指定为 TFM 来实现此目的。 有关详细信息,请参阅 .NET Standard。
C# 更新
编写 .NET 5 应用的开发人员将有权访问最新的 C# 版本和功能。 .NET 5 与 C# 9 搭配,为语言带来了许多新功能。 下面是几个亮点:
记录:具有基于值的相等语义的引用类型和由一个新的
with
表达式支持的非破坏性变化。关系模式匹配:将模式匹配功能扩展为关系运算符以用于比较计算和表达式,包括逻辑模式 - 新关键字
and
、or
和not
。顶级语句:作为加速采用和学习 C# 的一种方法,可以省略
Main
方法,像以下示例这样简单的应用程序是有效的:System.Console.Write("Hello world!");
函数指针:公开以下中间语言 (IL) 操作码的语言构造:
ldftn
和calli
。
有关 C# 9 功能的详细信息,请参阅 C# 9 中的新增功能。
源生成器
除了一些突出的新 C# 功能外,源生成器也正在加入开发人员项目。 源生成器允许在编译过程中运行的代码检查你的程序并生成额外的文件,与你的其他代码一起编译。
有关源生成器的详细信息,请参阅 C# 源生成器简介和 C# 源生成器示例。
F# 更新
F# 是 .NET 函数编程语言,有了.NET 5,开发人员就可以使用 F# 5。 其中一项新功能是内插字符串,它类似于 C# 甚至是 JavaScript 中的内插字符串。
let name = "David"
let age = 36
let message = $"{name} is {age} years old."
除了基本的字符串内插之外,还存在类型化内插。 对于类型化内插,给定类型必须与格式说明符匹配。
let name = "David"
let age = 36
let message = $"%s{name} is %d{age} years old."
此格式类似于 sprintf
函数,它根据类型安全输入来设置字符串的格式。
有关详细信息,请参阅 F# 5 中的新增功能。
Visual Basic 更新
在 .NET 5 中,Visual Basic 没有新的语言功能。 但在 .NET 5 中,Visual Basic 支持扩展到了以下内容:
说明 | dotnet new 参数 |
---|---|
控制台应用程序 | console |
类库 | classlib |
WPF 应用程序 | wpf |
WPF 类库 | wpflib |
WPF 自定义控件库 | wpfcustomcontrollib |
WPF 用户控件库 | wpfusercontrollib |
Windows 窗体 (WinForms) 应用程序 | winforms |
Windows 窗体 (WinForms) 类库 | winformslib |
单元测试项目 | mstest |
NUnit 3 测试项目 | nunit |
NUnit 3 测试项 | nunit-test |
xUnit 测试项目 | xunit |
有关 .NET CLI 中的项目模板的详细信息,请参阅 dotnet new
。
System.Text.Json 新功能
System.Text.Json 中新增了一些功能:
- 保留引用并处理循环引用
- HttpClient 和 HttpContent 扩展方法
- 允许或写入带引号的数字
- 支持不可变类型和 C# 9 记录
- 支持非公共属性访问器
- 支持字段
- 有条件地忽略属性
- 支持非字符串键字典
- 允许自定义转换器处理 null
- 复制 JsonSerializerOptions
- 用 Web 默认值创建 JsonSerializerOptions