.NET 5 中的新增功能
.NET 5 是在 3.1 之后的 .NET Core 的下一个主要版本。 此版本名为 .NET 5 而不是 .NET Core 4,原因有两个:
- 跳过了版本号 4.x,以避免与 .NET Framework 4.x 混淆。
- “Core”已从名称中删除,以强调这是 .NET 今后的主要实现。 .NET 5 支持比 .NET Core 或 .NET Framework 更多的应用类型和平台。
ASP.NET Core 5.0 基于 .NET 5,但保留名称“Core”以避免将其与 ASP.NET MVC 5 混淆。 同样,Entity Framework Core 5.0 保留名称“Core”,以避免将其与 Entity Framework 5 和 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 上序列化扩展方法
- 允许或写入带引号的数字
- 支持不可变类型和 C# 9 记录
- 支持非公共属性访问器
- 支持字段
- 有条件地忽略属性
- 支持非字符串键字典
- 允许自定义转换器处理 null
- 复制 JsonSerializerOptions
- 用 Web 默认值创建 JsonSerializerOptions