Skip to content

.NET 6 新特性

2021 年 11 月 8 日,.NET 6 正式发布

下载 .NET 6.0

.NET 6 提供 .NET 统一计划的最终部分,该计划在 .NET 5 中启动。 .NET 6 在移动、桌面、IoT 和云应用之间统一了 SDK、基础库和运行时。 除了这方面的统一以外,.NET 6 生态系统还提供了以下功能:

  • 简化开发:轻松入门。 C# 10 中的新语言功能可减少需要编写的代码量。 利用 Web 堆栈和最小 API 的投资,可以轻松地快速编写更小、更快速的微服务。

  • 更佳的性能:.NET 6 是最快的完整堆栈 Web 框架,如果在云中运行,则会降低计算成本。

  • 终极工作效率:.Net 6 和 Visual Studio 2022 提供热重载、新的 git 工具、智能代码编辑、可靠的诊断和测试工具以及更好的团队协作。

.NET 6 将作为长期支持 (LTS) 版本得到三年的支持。

Visual Studio 2022 和 Visual Studio 2022 for Mac(以及更高版本)支持 .NET 6。

性能

.NET 6 包含大量性能改进

FileStream

已为 .NET 6 重写 System.IO.FileStream 类型,以便在 Windows 上提供更佳的性能和可靠性。 现在 FileStream 绝不会在为 Windows 上的异步 I/O 创建时阻止。

按配置优化

按配置优化 (PGO) 是指 JIT 编译器根据最常使用的类型和代码路径生成优化后的代码。 .NET 6 引入了动态 PGO。 动态 PGO 与分层编译配合运作,以根据层级 0 中实施的其他检测来进一步优化代码。 动态 PGO 默认情况下处于禁用状态,但可以使用 DOTNET_TieredPGO 环境变量来启用它。

Crossgen2

.NET 6 引入了 Crossgen2,它是已被删除的 Crossgen 的后继版本。 Crossgen 和 Crossgen2 是用于提供预先 (AOT) 编译的工具,可改进应用的启动时间。 Crossgen2 是用 C# (而不是 C++)编写的,可执行之前的版本无法实现的分析和优化。

Arm64 支持

.NET 6 版本支持 macOS Arm64(或“Apple Silicon”)和 Windows Arm64 操作系统,支持本机 Arm64 执行和 x64 模拟。 此外,x64 和 Arm64 .NET 安装程序现在会并行安装。

热重载

使用热重载功能,可以修改应用源代码,并立即将这些更改应用到正在运行的应用。 此功能的目的是避免在编辑之间重新启动应用程序,从而提高工作效率。 热重载在 Visual Studio 2022 和 dotnet watch 命令行工具中可用。 热重载适用于大多数类型的 .NET 应用以及 C#、Visual Basic 和 C++ 源代码。

.NET MAUI

.NET 多平台应用 UI ( .NET MAUI) 仍处于预览状态,会在 2022 第一季度推出候选发布版本,并在 2022 的第二季度正式发布 (GA)。 使用 .NET MAUI,可以使用单个代码库生成适用于桌面和移动操作系统的本机客户端应用。

JSON 序列化改进

.NET 6 中的 System.Text.Json 已做了许多改进,因此它现在是一个“工业强度”的序列化解决方案。

源生成器

.NET 6 为 System.Text.Json 添加了新的源生成器。 源生成可与 JsonSerializer 配合使用,并且可以通过多种方式进行配置。 它可以提高性能、减少内存使用量并便于程序集剪裁。

可写 DOM

添加了新的可写文档对象模型 (DOM),补充预先存在的只读 DOM。 新 API 提供了一种轻型序列化替代方法,针对的是使用普通旧 CLR 对象 (POCO) 类型无法实现的情况。 它还让你能有效地导航到大型 JSON 树的子节,并读取该子节中的数组或反序列化该子节中的 POCO。 添加以下新类型以支持可写 DOM:

  • JsonNode
  • JsonArray
  • JsonObject
  • JsonValue

IAsyncEnumerable 序列化

System.Text.Json 现在支持使用 IAsyncEnumerable<T> 实例进行序列化和反序列化。 异步序列化方法在对象图中枚举任何 IAsyncEnumerable<T> 实例,然后将其序列化为 JSON 数组。 添加 JsonSerializer.DeserializeAsyncEnumerable<TValue>(Stream, JsonSerializerOptions, CancellationToken) 新方法以用于反序列化。

HTTP/3

.NET 6 包括对 HTTP/3(HTTP 的新版本)的预览支持。 HTTP/3 通过使用名为 QUIC 的新基础连接协议解决了一些现有的功能和性能难题。 QUIC 可以更快速地建立连接,并且连接独立于 IP 地址,使移动客户端能够在 Wi-fi 和移动电话网络之间进行漫游。

ASP.NET Core

ASP.NET Core 包括针对 Blazor WebAssembly 应用和单页应用的最小 API、提前执行 (AOT) 编译方面的改进。 此外,Blazor 组件现在可以从 JavaScript 呈现并集成到现有的基于 JavaScript 的应用。

OpenTelemetry

.NET 6 改进了对 OpenTelemetry 的支持,OpenTelemetry 是工具、API 和 SDK 的集合,有助于分析软件的性能和行为。 System.Diagnostics.Metrics 命名空间中的 API 实现 OpenTelemetry 指标 API 规范。 例如,有四个支持不同指标方案的检测类。 这些检测类包括:

  • Counter<T>
  • Histogram<T>
  • ObservableCounter<T>
  • ObservableGauge<T>

安全性

.NET 6 添加了对两项关键安全缓解措施的预览支持:控制流强制技术 (CET) 以及“写入独占执行”(W^X)。

CET 是一种 Intel 技术,在部分较新的 Intel 和 AMD 处理器中可用。 它将功能添加到硬件,防止某些控制流劫持攻击。 .NET 6 为 Windows x64 应用提供了对 CET 的支持,且必须显式启用它。 有关详细信息,请参阅 .NET 6 与 Intel CET 卷影堆栈的兼容性。

可通过 .NET 6 在所有操作系统上使用 W^X,但它仅在 Apple Silicon 上默认启用。 W^X 通过禁止内存页同时可写入和可执行来阻止最简单的攻击路径。

IL 剪裁

改进了独立部署的剪裁。 在 .NET 5 中,仅剪裁未使用的程序集。 .NET 6 还添加了对未使用的类型和成员的剪裁。 此外,现在默认启用剪裁警告,会在剪裁可能会删除运行时使用的代码时发出警告。

代码分析

.NET 6 SDK 包括一些新的代码分析器,这些分析器涉及 API 兼容性、平台兼容性、剪裁安全性、在字符串串联和拆分中使用范围、更快的字符串 API 和更快的集合 API。

自定义平台临界子句

平台兼容性分析器将 OperatingSystem 类中的 Is<Platform> 方法(例如 OperatingSystem.IsWindows())识别为平台临界子句。 为了让你使用自定义平台临界子句,.NET 6 引入了两个新特性,可用于使用受支持的或不受支持的平台名称对字段、属性或方法进行批注:

  • SupportedOSPlatformGuardAttribute
  • UnsupportedOSPlatformGuardAttribute

Windows 窗体

Application.SetDefaultFont(Font) 是 .NET 6 中的一种新方法,可对整个应用程序设置默认字体。

C# Windows 窗体应用的模板已更新为支持 global using 指令、文件范围内的命名空间以及可为 null 的引用类型。 此外,它们还包括应用程序启动代码,能减少样板代码,并允许 Windows 窗体设计器以首选字体呈现设计图面。 启动代码是对 ApplicationConfiguration.Initialize() 的调用,这是一种源生成的方法,可发出对其他配置方法(如 Application.EnableVisualStyles())的调用。 此外,如果通过 ApplicationDefaultFont MSBuild 属性设置非默认字体,ApplicationConfiguration.Initialize() 会发出对 SetDefaultFont(Font) 的调用。

目标框架名字对象

为 .NET 6 添加了其他特定于 OS 的目标框架名字对象 (TFM),例如 net6.0-androidnet6.0-iosnet6.0-macos

反射 API

.NET 6 引入了以下新 API,用于检查代码并提供可为 null 的信息:

  • System.Reflection.NullabilityInfo
  • System.Reflection.NullabilityInfoContext
  • System.Reflection.NullabilityState

这些 API 可用于基于反射的工具和序列化程序。

日期、时间和时区改进

.NET 6 中添加了以下两个结构:System.DateOnlySystem.TimeOnly。 它们分别表示 DateTime 的日期部分和时间部分。 DateOnly 适用于生日和周年纪念,而 TimeOnly 适用于日常闹钟和每周营业时间。

现在,可以在安装了时区数据的任何操作上使用 Internet Assigned Numbers Authority (IANA) 或 Windows 时区 ID。 TimeZoneInfo.FindSystemTimeZoneById(String) 方法已更新,当在系统上找不到请求的时区时,能自动将其输入从 Windows 时区转换为 IANA 时区(或者从 IANA 时区转换为 Windows 时区)。 此外,针对仍然需要手动从一个时区格式转换为另一个时区格式的情况,已添加新方法 TryConvertIanaIdToWindowsId(String, String)TryConvertWindowsIdToIanaId

PriorityQueue 类

新的 PriorityQueue<TElement,TPriority> 类表示同时具有值和优先级的项的集合。 这些项按优先级的升序取消排行 - 即优先级值最低的项首先取消排行。 此类实现最小堆数据结构。

你觉得这篇文章怎么样?
  • 0
  • 0
  • 0
  • 0
  • 0
  • 0
评论
  • 按正序
  • 按倒序
  • 按热度