65.9K
CodeProject 正在变化。 阅读更多。
Home

.NET 6 - 新特性

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.38/5 (6投票s)

2022年5月30日

CPOL

7分钟阅读

viewsIcon

20947

.NET 6 有哪些新特性

引言

2021年11月8日,微软发布了新版本的.NET,名为.NET 6。据微软称,这是“迄今为止最快的.NET”,并且该版本是LTS(长期支持版本),支持3年。

基本上,.NET 6 更侧重于 C# 和 F# 语言,并在此版本中引入了 C# 10 和 F# 6,这将使我们的代码比旧版本的 .NET 更简洁、更快、更好。此版本适用于 Linux、Mac 和 Windows 平台。

让我们来了解一下 .NET 这一版本发布的新特性。

性能

这是这些新特性中主要且值得注意的改变。.NET 6 在许多功能上进行了优化,但我们现在将介绍其中三个。

文件流

在 .NET 6 中,System.IO.FileStream 命名空间及其所有类几乎都进行了重写。这使得该类比以前更快、更可靠。

现在,文件流不会阻塞 Windows 上的异步 I/O 操作。这里有一些示例。

在 .NET 5 中,fileStream 命名空间中的 getlength() 方法需要 1,932 纳秒才能执行,而在 .NET 6 中,它只需要 58.52 纳秒才能执行。因此,您可以想象,它现在快了好几倍。在 Mac 和 Linux 环境中也能体验到同样的效果。

JIT 编译

.NET 6 在 JIT 编译技术方面进行了性能优化。.NET 6 通过配置文件引导优化 (PGO) 技术来优化编译后的代码,但在 .NET 6 中,他们引入了动态配置文件引导优化 (DPGO),JIT 编译器通过这种技术生成优化后的代码。但是,这次它与分层编译结合使用,以分层 0 的方式生成更优化的代码。DPGO 默认禁用,您需要启用它才能使用此功能。

引入 Crossgen2

.NET 6 引入了 Crossgen 2,它有助于更快地生成和优化本机代码。Crossgen 2 使用 C# 而不是 C++ 重写。

借助这个改进的 Crossgen 版本,可以对本机代码进行分析和优化,从而提高了应用程序的启动速度。

对于不了解 Crossgen 的人,这里有一个简要介绍。

什么是 Crossgen?

Crossgen 是一种工具,可以在实际 JIT 工作之前提前编译代码,从而减少 JIT 时间。基本上,它会遍历所有程序集,并将编译后的代码存储在一个单独的区域。然后,在运行时可以快速获取该编译后的代码。这有助于加快应用程序的启动速度。

Crossgen2 的引入是为了克服 Crossgen 的限制,Crossgen 只能一次生成一种本机代码。

支持 ARM64

.NET 6 现在支持 Mac 和 Windows 上的 ARM64 处理器和操作系统。这意味着从现在开始,它支持 X64 ARM 和 64 位操作系统。

对于不了解 ARM OS 的人,这里有一个简要介绍。

基本上,ARM 是一种与 X86(32 位)和 X64(64 位)类似的 CPU 架构,用于 Windows,但这种架构是为移动和智能设备开发的。

ARM64 是 ARM 架构的下一版本,支持 64 位处理。

热重载

这个特性对开发人员非常有用。他们可以修改代码并立即将其应用到正在运行的应用程序中。这将有助于他们提高开发效率,基本上这个特性有助于减少编辑次数和应用程序编译之间的时间。所有类型的应用程序开发都支持此特性,如 Web、桌面、移动开发、云和其他项目类型。但请注意,此特性不适用于 Xamarin.Forms 和使用 F# 构建的应用程序。

Visual Studio 中的“热重载”图标显示为类似火焰的符号。此功能不仅有助于即时应用代码更改,还有助于更快地重新启动应用程序。

此外,此功能还引入了“保存时热重载”功能,在该功能中,单击 **保存** 按钮后,应用程序将自动热重载并应用保存的更改。需要注意的是,此功能是可选的,我们可以随时将其关闭。

.NET MAUI

MAUI 也称为 .NET Multi-platform App UI。此功能刚刚推出,仍处于预览阶段。通过此功能,开发人员可以使用单一代码库为桌面和移动设备开发应用程序(客户端应用)。.NET MAUI 在 Blazor 混合场景中使用本机容器和控件。

C#10 及其相关特性

随着 .NET 6 的推出,还包含 C# 10 及其相关特性。在这些 .NET 特性中,C# 已被修改和升级,以使用一些新的语言特性,例如

  • 同步 Main 方法
  • 目标类型化 new 表达式
  • 文件范围的命名空间
  • 可空引用类型

在这里,需要注意的一点是,升级到 .NET 6 后,您现有的 C# 代码或功能不会受到影响。

F# 改进

在 C# 中可以找到以下新改进

  • 本机 .NET 任务支持
  • 使用 expr[idx] 使索引语法更简单
  • "as" 模式
  • 缩进语法修订
  • 二进制数字格式
  • NativePtr 的更改

HTTP/3

HTTP/3 是 HTTP 的新版本。在这个新版本中,HTTP 使用 QUIC 协议,QUIC 协议被用作底层连接协议。

该协议有助于更快速地建立连接,并且与 IP 地址无关。它还允许移动和智能设备在 WIFI 和其他无线网络之间漫游,在此版本之前,HTTP 使用 HTTP/1.1 和 HTTP/2。

HTTP/3 即使在网络数据包较少的情况下也能改进连接请求。

System.Text.Json API 改进

JSON API 进行了许多改进,其中一些如下

新的源生成器

.NET 6 为 System.Text.JSON 引入了新的源生成器,现在源生成器可以与 JSON 序列化器一起使用,并且可以进行多种配置。它有助于提高性能,减少内存消耗。

**对于不知道源生成器 (SG) 的人来说,它是 C# 编译器的一项功能,它可以在运行时动态生成新的 C# 源文件,并将其添加到编译中。

可写 DOM

当无法使用普通 CLR 对象时,这是一种新的轻量级序列化替代方案。它帮助我们遍历大型 JSON 树并读取节点。

新的序列化可写 DOM 支持以下类型

  • JsonNode
  • JsonArray
  • JsonValue
  • JsonObject

在 JSON 中使用 IAsyncEnumerable

现在可以使用 .NET 6 进行 IAsyncEnumerable <T> 的序列化和反序列化。

IAsyncEnumerable 类型可以序列化为 JSON 数组,对于反序列化,使用了一个新方法(JsonSerializer.DeserializeAsyncEnumerable)。

以下是新添加的序列化接口

  • IJsonOnDeserialized
  • IJsonOnSerialized
  • IJsonOnDeserializing
  • IJsonOnSerializing

安全改进

.NET 6 在安全性方面也进行了一些改进:现在它支持控制流强制技术 (Control-flow Enforcement Technology) 和写独执行 (write exclusive execute)。

写独执行 (W^X)

这种安全方面通过避免同时存在可写和可执行的内存页面来阻止简单的攻击路径。

控制流强制技术 (CET)

基本上,CET(控制流技术)由 Intel 引入,它帮助我们防范控制流劫持攻击。.NET 6 还支持 x64 应用程序。

未使用的程序集修剪

基本上,此功能已在 .NET 5 中引入,它有助于修剪未使用的程序集,但在 .NET 6 中,该功能已升级到未使用的类型和成员。今后,未使用的类型和成员也将被修剪。

Windows 窗体改进

Application.SetDefaultFont(Font) 是 .NET 6 引入的一个新方法,顾名思义,它为 WinForms 设置默认字体。

此外,C# Windows 窗体已更新,以支持 using 指令、文件范围的命名空间和可空引用。

新的目标框架

在 .NET 6 中引入了新的目标框架。现在您可以在目标框架中看到 net 6.0-android、net 6.0-ios 和 net 6.0-macos。

与 LINQ 相关的新 API

.NET 6 发布了新的 LINQ 相关 API,例如

  • Enumerable.TryGetNonEnumeratedCount - 获取序列中的元素数量
  • Enumerable.Chunk - 将序列元素分成块
  • Enumerable.MaxBy - 使用键查找最大元素
  • Enumerable.MinBy - 使用键查找最小元素

兼容性

.NET 兼容性和支持的版本如下

  • .NET 6 支持 VS 2022,即 17 版

.NET 6 随以下运行时支持一起发布

  • .NET Runtime 6.0.0
  • ASP.NET Core Runtime 6.0.0
  • .NET Desktop Runtime 6.0.0
  • .NET 6 支持以下语言
    • C# 10.0
    • F# 6.0
    • Visual Basic 16.9

关注点

如果您的应用程序是基于旧版 .NET Framework 构建的,那么迁移到 6.x 将需要更多工作。

希望本文能让您对 .NET 6 的新特性有所了解。在下一篇文章中,我们将进一步探讨 C# 10。

欢迎提出建议和疑问。

感谢阅读!

历史

  • 2022年5月30日:初版
© . All rights reserved.