使用英语阅读

通过


.NET 7 中的新增功能

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

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

性能

性能是 .NET 7 的关键焦点,其所有功能都考虑到了性能。 此外,.NET 7 还包含以下旨在纯粹提升性能的改进:

  • 栈上替换 (OSR) 是对分层编译的补充。 它允许运行时在其执行过程中更改当前正在运行的方法执行的代码(即,在堆栈上运行时)。 长时间运行的方法可以在执行过程中切换到更优化的版本。
  • 按配置优化 (PGO) 现在适用于 OSR,可以(通过将 <TieredPGO>true</TieredPGO> 添加到项目文件)更轻松地启用。 PGO 还可以检测和优化更过内容,例如委托。
  • 改进了 Arm64 的代码生成。
  • 本机 AOT 以目标平台的文件格式生成独立的可执行文件,没有外部依赖项。 它完全是本机的,没有 IL 或 JIT,并提供快速的启动时间和一个小型的独立部署。 在 .NET 7 中,Native 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 正则表达式 库在 .NET 7 中出现了显著的功能和性能改进:

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

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

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

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

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

.NET 库

对 .NET 库 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 意味着不再需要对“刻度”值执行计算,以确定微秒和纳秒值。 有关详细信息,请参阅 .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 enum
- 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/Invokes)引入了源生成器。 源生成器在 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 MAUI for .NET 7中的新增功能。

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 (Windows Presentation Foundation)

.NET 7 中的 WPF 包括许多错误修复、性能改进和辅助功能的增强。 有关详细信息,请参阅 .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 博客文章。

另请参阅