.NET 7 的新增功能

.NET 7 是 .NET 6 的后继版本,侧重于统一、新式、简单和快速的特点。 .NET 7 将作为标准期限支持 (STS) 版本(以前称为 Current 版本)支持 18 个月

本文列出了 .NET 7 的新功能,并提供了每个功能的详细信息的链接。

若要查找已针对 .NET 7 更新的所有 .NET 文章,请参阅 .NET 文档:.NET 7 版本的新增功能

性能

性能是 .NET 7 的一个重点,它的所有功能在设计时都考虑到了性能。 此外,.NET 7 还包括以下纯粹以性能为目标的增强功能:

  • 栈上替换 (OSR) 是对分层编译的补充。 它允许运行时更改当前正在运行的方法在其执行期间(也就是说,当它“在堆栈上”时)执行的代码。 长时间运行的方法可以在执行过程中切换到更优化的版本。
  • 按配置优化 (PGO) 现在适用于 OSR,可以(通过将 <TieredPGO>true</TieredPGO> 添加到项目文件)更轻松地启用。 PGO 还可以检测和优化更过内容,例如委托。
  • 改进了 Arm64 的代码生成。
  • 本机 AOT 以目标平台的文件格式生成独立的可执行文件,没有外部依赖项。 它完全是本机的,没有 IL 或 JIT,并提供快速的启动时间和一个小型的独立部署。 在 .NET 7 中,本机 AOT 侧重于控制台应用,并要求对应用进行剪裁。
  • 对 Mono 运行时的性能改进,这为 Blazor WebAssembly、Android 和 iOS 应用提供了支持。

若要详细了解使 .NET 7 如此快速的许多关注性能的功能,请参阅 .NET 7 中的性能改进博客文章。

System.Text.Json 序列化

.NET 7 在以下方面对 System.Text.Json 序列化进行了改进:

  • 协定自定义,可以更好地控制如何序列化和反序列化类型。 有关详细信息,请参阅自定义 JSON 协定
  • 用于用户定义类型层次结构的多态序列化。 有关详细信息,请参阅序列化派生类的属性
  • 支持必需的成员,这些成员是必须存在于 JSON 有效负载中的属性,用于实现成功的反序列化。 有关详细信息,请参阅必需属性

有关这些更新和其他更新的信息,请参阅 .NET 7 中 System.Text.Json 的新增功能博客文章。

泛型数学

.NET 7 和 C# 11 的创新使你可以常规地执行数学运算,也就是说,无需知道正在使用的确切类型。 例如,如果想编写一个将两个数字相加的方法,在以前,必须为每种类型添加方法的重载。 现在,可以编写一个单一的泛型方法,其中将类型参数约束为类似于数字的类型。 有关详细信息,请参阅泛型数学一文和泛型数学博客文章。

正则表达式

在 .NET 7 中,对 .NET 的正则表达式库的功能和性能进行了重大改进:

  • 使用新选项 RegexOptions.NonBacktracking,可以通过避免回溯并保证处理时间与输入长度呈线性关系的方法进行匹配。 非回溯引擎不能用于从右到左的搜索,而且还有其他一些限制,但对所有正则表达式和输入来说,速度很快。 有关详细信息,请参阅非回溯模式

  • 正则表达式源生成器是全新的。 源生成器生成一个引擎,该引擎在编译时针对模式进行优化,从而提供吞吐量性能优势。 发出的源是项目的一部分,可以查看和调试它。 此外,还有一个新的源生成器诊断 SYSLIB1045 通知你使用 Regex 的位置,该位置可以转换为源生成器。 有关详细信息,请参阅 .NET 正则表达式源生成器

  • 对于不区分大小写的搜索,.NET 7 具有较大的性能提升。 这是因为指定 RegexOptions.IgnoreCase 不再对模式中的每个字符和输入中的每个字符调用 ToLower。 相反,所有与大小写相关的工作都在构造 Regex 时完成。

  • Regex 现在支持一些 API 的跨度。 作为此项支持的一部分,增加了以下新方法:

有关这些改进和其他改进的详细信息,请参阅 .NET 7 中的正则表达式改进博客文章。

.NET 库

对 .NET 库 API 做出了许多改进。 部分改进在本文的其他专门章节中有所提及。 其他一些改进在下表中进行了总结。

说明 API 更多信息
TimeSpanTimeOnlyDateTimeDateTimeOffset 类型中支持微秒和纳秒 - DateTime.Microsecond
- DateTime.Nanosecond
- DateTime.AddMicroseconds(Double)
- 新的 DateTime 构造函数重载

- DateTimeOffset.Microsecond
- DateTimeOffset.Nanosecond
- DateTimeOffset.AddMicroseconds(Double)
- 新的 DateTimeOffset 构造函数重载

- TimeOnly.Microsecond
- TimeOnly.Nanosecond

- TimeSpan.Microseconds
- TimeSpan.Nanoseconds
- TimeSpan.FromMicroseconds(Double)
- 还有一些其他 API。
使用这些 API,不再需要对“计时周期”值执行计算就能确定微秒和纳秒值。 有关详细信息,请参阅 .NET 7 预览版 4 博客文章。
用于读取、写入、存档和提取 tar 存档的 API System.Formats.Tar 有关详细信息,请参阅 .NET 7 预览版 4.NET 7 预览版 6 博客文章。
速率限制 API 通过将流量保持在安全的级别来保护资源 RateLimiter 和 System.Threading.RateLimiting NuGet 包中的其他 API 有关详细信息,请参阅在 .NET 中限制 HTTP 处理程序的速率宣布发布 .NET 的速率限制
用于从 Stream 读取所有数据的 API - Stream.ReadExactly
- Stream.ReadAtLeast
Stream.Read 返回的数据可能少于流中可用的数据。 新的 ReadExactly 方法准确地读取请求的字节数,新的 ReadAtLeast 方法至少读取请求的字节数。 有关详细信息,请参阅 .NET 7 预览版 5 博客文章。
用于 DateOnlyTimeOnlyInt128UInt128Half 的新类型转换器 System.ComponentModel 命名空间中:

- DateOnlyConverter
- TimeOnlyConverter
- Int128Converter
- UInt128Converter
- HalfConverter
类型转换器通常用于与字符串之间来回转换值类型。 这些新 API 为最近添加的类型添加了类型转换器。
IMemoryCache 的指标支持 - MemoryCacheStatistics
- MemoryCache.GetCurrentStatistics()
GetCurrentStatistics() 允许使用事件计数器或指标 API 跟踪一个或多个内存缓存的统计信息。 有关详细信息,请参阅 .NET 7 预览版 4 博客文章。
用于获取和设置 Unix 文件权限的 API - System.IO.UnixFileMode 枚举
- File.GetUnixFileMode
- File.SetUnixFileMode
- FileSystemInfo.UnixFileMode
- Directory.CreateDirectory(String, UnixFileMode)
- FileStreamOptions.UnixCreateMode
有关详细信息,请参阅 .NET 7 预览版 7 博客文章。
指示字符串中应使用哪种语法的属性 StringSyntaxAttribute 例如,可以通过将 string 参数归为 [StringSyntax(StringSyntaxAttribute.Regex)] 来指定该参数需要正则表达式。
在浏览器或其他 WebAssembly 体系结构中运行时用于与 JavaScript 互操作的 API System.Runtime.InteropServices.JavaScript JavaScript 应用可以使用 .NET 7 中扩展的 WebAssembly 支持来重复使用 JavaScript 中的 .NET 库。 有关详细信息,请参阅在 .NET 7 中从任意 JavaScript 应用使用 .NET

可观察性

.NET 7 改进了可观测性。 可观测性可帮助你了解在应用缩放时以及技术复杂性增加时应用的状态。 .NET 的可观测性实现主要是围绕 OpenTelemetry 构建的。 改进包括:

有关详细信息,请参阅 .NET 7 预览版 4 博客文章。

.NET SDK

.NET 7 SDK 提升了 CLI 模板体验。 它还支持发布到容器,以及使用 NuGet 集中管理包。

模板

dotnet new 命令和模板创作进行了一些可喜的改进。

dotnet new

dotnet new CLI 命令基于模板创建新项目、配置文件或解决方案,现在支持通过 Tab 自动补全来浏览:

  • 可用的模板名称
  • 模板选项
  • 允许的选项值

此外,为了更好地保持一致,installuninstallsearchlistupdate 子命令不再有 -- 前缀。

创作

模板约束是 .NET 7 的一个新概念,可用于定义允许在哪个上下文中使用模板。 约束可帮助模板引擎确定哪些模板应该在 dotnet new list 等命令中显示。 可以将模板限制为操作系统、模板引擎主机(例如 Visual Studio 中的 .NET CLI 或“新建项目”对话框),以及已安装的工作负载。 需要在模板的配置文件中定义约束。

此外,在模板配置文件中,现在可以将模板参数批注为允许多个值。 例如,web 模板允许多种形式的身份验证。

有关详细信息,请参阅 .NET 7 预览版 6 博客文章。

发布到容器

容器是在云中分发和运行各种应用程序和服务的最简单方法之一。 容器映像现在是 .NET SDK 支持的输出类型,你可以使用 dotnet publish 创建应用程序的容器化版本。 有关此功能的详细信息,请参阅宣布对 .NET SDK 的内置容器支持。 有关教程,请参阅使用 dotnet publish 容器化 .NET 应用

中央包管理

现在,可以使用 NuGet 的中央包管理 (CPM) 功能从一个位置管理项目中的常见依赖项。 要启用它,请将 Directory.Packages.props 文件添加到存储库的根目录中。 在此文件中,将 MSBuild 属性 ManagePackageVersionsCentrally 设置为 true,并使用 PackageVersion 项添加常见包依赖项的版本。 然后,在各个项目文件中,可以从引用集中管理的包的任何 PackageReference 项中省略 Version 属性。

有关详细信息,请参阅中央包管理

P/Invoke 源生成

.NET 7 为 C# 中的平台调用 (P/Invoke) 引入了一个源生成器。 源生成器在 staticpartial 方法上查找 LibraryImportAttribute,以触发封送代码的编译时源生成。 在编译时生成封送代码,就不再需要在运行时生成 IL 存根,就像使用 DllImportAttribute 时一样。 源生成器可提高应用程序性能,还让应用可以提前 (AOT) 编译。 有关详细信息,请参阅平台调用的源生成在源生成的 P/Invoke 中使用自定义封送程序

本部分包含了相关产品的信息,这些产品的版本与 .NET 7 版本一致。

Visual Studio 2022 版本 17.4

有关详细信息,请参阅 Visual Studio 2022 中的新增功能

C# 11

C# 11 包括对泛型数学、原始字符串字面量、文件范围类型和其他新功能的支持。 有关详细信息,请参阅 C# 11 中的新增功能

F# 7

F# 7 继续着使语言更简单的旅程,通过新的 C# 功能提高性能和互操作。 有关详细信息,请参阅宣布推出 F# 7

.NET MAUI

.NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创建本机移动和桌面应用。 它将 Android、iOS、macOS 和 Windows API 统一为单个 API。 有关最新更新的信息,请参阅适用于 .NET 7 的 .NET MAUI 中的新增功能

ASP.NET Core

ASP.NET Core 7.0 包括速率限制中间件、对最小 API 的改进和 gRPC JSON 转码。 有关所有更新的信息,请参阅 ASP.NET Core 7 中的新增功能

EF Core

Entity Framework Core 7.0 包括对 JSON 列的与提供程序无关的支持、针对保存更改的性能改进,以及自定义反向工程模板。 有关所有更新的信息,请参阅 EF Core 7.0 中的新增功能

Windows 窗体

在 .NET 7 的 Windows 窗体方面投入了大量工作。 在以下方面进行了改进:

  • 辅助功能
  • 高 DPI 和缩放
  • 数据绑定

有关详细信息,请参阅 .NET 7 的 Windows 窗体的新增功能

WPF

.NET 7 的 WPF 包括大量 bug 修复以及性能和辅助功能改进。 有关详细信息,请参阅 .NET 7 中 WPF 的新增功能博客文章。

Orleans

Orleans 是一个跨平台框架,用于构建可靠且可缩放的分散式应用程序。 有关 Orleans 的最新更新的信息,请参阅从 Orleans 3.x 迁移到 7.0

.NET 升级助手和 CoreWCF

.NET 升级助手现在支持将服务器端 WCF 应用升级为 CoreWCF,这是社区创建的 WCF 到 .NET (Core) 的端口。 有关详细信息,请参阅升级 WCF 服务器端项目以使用 CoreWCF

ML.NET

ML.NET 现在包含一个文本分类 API,它可以轻松地使用最新、最先进的深度学习技术来训练自定义文本分类模型。 有关详细信息,请参阅 AutoML 和工具的新增功能ML.NET 文本分类 API 简介博客文章。

另请参阅