Home / Blog

.NET 9 与 .NET 8 对比:有哪些新特性,以及为什么要升级

Carlos Casalicchio · June 9, 2026 ·6 分钟阅读

.NET 的发布节奏持续加快

微软于 2024 年 11 月发布了 .NET 9,作为标准期支持(STS)版本,其改进速度丝毫没有放缓的迹象。仅 dotnet/runtime 仓库就合并了超过 7,500 个拉取请求,.NET 9 是该平台迄今为止最快、能力最强的版本。

但"最快"是个抽象的说法。作为开发者,我们需要知道:究竟改变了什么,什么让我们的代码变得更好,以及是否值得升级?

本指南将逐项剖析从 .NET 8 到 .NET 9 的每一项重要改进——从 C# 13 语言特性到运行时性能提升、AI 集成以及 ASP.NET Core 增强功能——帮助你为团队做出明智的决策。

C# 13:你真正会用到的语言特性

C# 13 随 .NET 9 SDK 一同发布,引入了多项能够减少样板代码并提升安全性的特性:

params 集合

此前,params 仅限于数组。C# 13 将 params 支持扩展到任何实现了 IEnumerable<T> 并具有 Add 方法的集合类型——包括 List<T>Span<T>ReadOnlySpan<T>。这消除了在调用带可变参数的方法时不必要的数组分配。

全新的 Lock 类型与语义

System.Threading.Lock 类型以一个编译器可识别的专用类型取代了传统的 lock (obj) { } 模式。新的 lock 关键字与 Lock 对象配合使用,可生成更高效的代码,并改善调试支持。

ref struct 接口

ref struct 类型现在可以实现接口,并可作为泛型的类型参数使用。这解锁了诸如基于 span 的高性能抽象等此前因类型约束而无法实现的模式。

部分属性与索引器

部分属性和索引器现在允许在部分类型中使用,使源生成器更具表达力。库作者可以在生成的代码中声明部分属性,而具体实现则位于用户代码中——这一模式大幅简化了由源生成器驱动的架构。

重载决策优先级

库作者现在可以使用 [OverloadResolutionPriority] 特性将某个重载指定为优于其他重载。这消除了在向现有 API 添加新重载时产生的调用歧义编译错误,且不会破坏使用方。

对象初始化器中的隐式索引器访问

你现在可以在对象初始化器中使用 ^ 运算符(从末尾索引),使得从序列末尾填充集合时初始化更具表达力。

运行时性能:每一个周期都很重要

.NET 9 的性能故事建立在数百项有针对性的改进之上,这些改进在实际应用中叠加起效。以下是重点:

动态 PGO:现在可优化类型转换与分支

动态性能引导优化(PGO)——在 .NET 8 中引入——现已从虚方法分派扩展到包括类型转换优化。JIT 会跟踪 obj is T(T)obj 操作中最常遇到的类型,然后为这些类型生成快速路径。在微基准测试中,类型检查操作在常见路径上运行速度最高提升 4 倍

循环优化:强度削减与向下计数

JIT 现在会对数组迭代循环执行强度削减,将基于索引的访问转换为指针运算。结合自动向下计数(用单条 jns 替代 cmp + jl),紧凑循环每次迭代可减少一条指令。对于遍历大型集合的热点循环,这些收益会迅速累积。

边界检查消除:比以往更智能

JIT 的边界检查分析现在能够处理此前遗漏的模式——反向索引、复杂循环条件,以及与前置长度检查相互作用的基于 span 的访问。更少的边界检查意味着更紧凑的循环,以及更少可能预测失败的分支。

垃圾回收:动态自适应

服务器 GC 现在包含对应用规模的动态自适应,并默认启用。GC 会根据应用实际的内存模式而非固定的启发式规则来调整行为,在不牺牲吞吐量的前提下降低内存密集型工作负载的暂停时间。

向量化与 Arm64

Arm64 代码生成获得了大量关注,包括扩展的 SIMD 向量化以及对 Arm 专用指令的更好利用。对于运行在 Graviton 或 Ampere 处理器上的云工作负载,这直接转化为更低的计算成本。

ASP.NET Core 9:默认安全,设计更快

ASP.NET Core 9 在自动化安全改进的同时,进一步提升了性能上限:

内置 OpenAPI 文档生成

全新的 Microsoft.AspNetCore.OpenApi 包提供内置的 OpenAPI 文档生成,无需 Swashbuckle 或 NSwag。来自最小 API、控制器以及类型注解的元数据会自动反映在生成的 OpenAPI 规范中——减少依赖变动并改善兼容性。

静态资源指纹化

对静态文件(JavaScript、CSS)的构建时和发布时优化现在包含自动指纹版本控制。缓存失效变得自动化,消除了陈旧资源缺陷这一常见问题源。

Blazor 改进

全新的 Hybrid 和 Web App 模板简化了项目设置。组件渲染模式检测改善了调试体验。Blazor Server 的重连体验经过重新设计,在网络连接中断时为用户提供更流畅的体验。

Native AOT 扩展

ASP.NET Core 中的预先(AOT)编译支持得到扩展,降低了冷启动延迟和内存占用。对于容器化微服务,Native AOT 意味着更小的镜像和更快的横向扩展事件。

Linux HTTPS 开发证书

在 Linux 上为开发期间的 HTTPS 设置受信任的开发证书现在明显更加简单——这对在 Linux 工作站上进行开发的团队是一项体验上的提升。

AI 构建模块:.NET 原生拥抱 AI

.NET 9 引入了统一的 AI 抽象层,将 .NET 定位为构建 AI 驱动应用的一流平台:

Microsoft.Extensions.AI

一套用于与 AI 服务交互的 C# 抽象——涵盖小型和大型语言模型(SLM 与 LLM)、嵌入以及向量存储。无论你调用的是 OpenAI、Azure OpenAI,还是通过 ONNX Runtime 运行的本地模型,这些包都提供一致的编程模型。

Tensor<T> 与 TensorPrimitives

全新的 Tensor<T> 类型提供高效的多维数据操作,并与 ML.NET、TorchSharp 和 ONNX Runtime 实现零拷贝互操作。TensorPrimitives 从 40 个扩展到近 200 个 SIMD 优化操作——涵盖推理和特征工程所需的数值原语。

ML.NET 4.0

ML.NET 4.0 带来了以 Stream 方式加载 ONNX 模型的能力,对 GPT、Llama、Phi 和 Bert 模型的全新分词器支持,以及 Llama 和 Phi 模型系列的实验性 TorchSharp 移植。如果你正在构建需要设备端或进程内 AI 推理的 .NET 应用,正是这个版本让它变得切实可行。

Tokenizers 库

Microsoft.ML.Tokenizers 库现在开箱即用地支持 Tiktoken(GPT-3/4/4o/o1)、Llama、CodeGen、Phi2 和 Bert 分词器。这对于管理上下文窗口、计算 token 成本以及为本地模型预处理文本至关重要。

EF Core 9:Cosmos DB 与预编译查询

Entity Framework Core 9 聚焦两个方向:更深入的 Azure Cosmos DB for NoSQL 集成,以及为预先编译打下基础:

  • Cosmos DB 提供程序:针对 NoSQL 提供程序的重大更新,包括改进的 LINQ 转换、分层分区键支持以及更好的吞吐量管理。
  • 预编译查询:迈向 AOT 编译查询,消除运行时查询编译开销——这对无服务器和容器化环境中的冷启动性能至关重要。
  • 复杂类型改进:对拥有实体和值对象的处理更佳,减少构建富领域模型所需的样板代码。

.NET MAUI:性能与桌面集成

.NET 9 中的 .NET MAUI 优先关注性能和桌面能力:

  • CollectionView 和 CarouselView 在 iOS 和 Mac Catalyst 上获得了全新、性能更好的实现。
  • HybridWebView 让在 MAUI 应用中嵌入 React、Vue.js 或 Angular 内容更加容易。
  • 面向 Windows 桌面应用的 TitleBar 控件,提供原生标题栏定制能力。
  • Native AOT 与裁剪的改进减小了移动端的应用体积和启动时间。

.NET 8 与 .NET 9:并排对比

类别 .NET 8 .NET 9
发布类型 LTS(3 年支持) STS(2 年支持)
C# 版本 C# 12 C# 13
动态 PGO 虚方法/接口分派 新增类型转换、分支、整数性能剖析
AI 抽象 无(仅 NuGet 包) Microsoft.Extensions.AI、Tensor<T>
OpenAPI 第三方(Swashbuckle) 内置 Microsoft.AspNetCore.OpenApi
GC 模式 固定的服务器/工作站模式 对应用规模的动态自适应
ref struct 无法实现接口 可实现接口,可作泛型参数使用
循环优化 基础循环识别 强度削减、向下计数
LINQ 标准运算符 新增 CountBy、AggregateBy
Native AOT 有限的 ASP.NET 支持 扩展的 ASP.NET 支持

你该升级吗?

如果符合以下情况,应立即升级:

  • 你运行的是对性能敏感的工作负载,能够从 JIT、GC 和循环优化中获益。
  • 你正在构建 AI 驱动的功能——仅全新的 Microsoft.Extensions.AI 抽象和分词器支持就值得迁移。
  • 你部署在 Arm64(Graviton、Ampere)上——Arm64 代码生成改进直接降低云成本。
  • 你维护 NuGet 库——C# 13 特性如 [OverloadResolutionPriority] 和部分属性改善了库开发的体验。

如果符合以下情况,应考虑时间安排:

  • 你需要 LTS 支持——.NET 8 将持续获得支持至 2027 年 11 月。如果你的组织出于合规要求需要 LTS,请转而规划 .NET 10(LTS)迁移,同时将 .NET 9 用于新项目。
  • 你依赖尚未添加 .NET 9 目标的第三方包——在迁移前请先确认你的关键依赖是否支持 net9.0

对于 nopCommerce 和 Umbraco 用户:

  • nopCommerce 4.90 原生面向 .NET 9——如果你使用的是 4.80 或更早版本,升级到 4.90 会自动为你带来所有这些改进。
  • Umbraco 14+ 运行在 .NET 9 上——SplatDev 的 20 多个 Umbraco 插件均已迁移并针对 .NET 9 兼容性进行了测试。

升级路径:一份实用清单

  1. 安装 .NET 9 SDK:dotnet.microsoft.com 下载。
  2. 更新目标框架:在所有 .csproj 文件中将 <TargetFramework>net8.0</TargetFramework> 改为 <TargetFramework>net9.0</TargetFramework>
  3. 更新包引用:将所有 NuGet 包升级到其支持 .NET 9 的最新版本。
  4. 处理破坏性变更:查阅官方破坏性变更列表——对大多数应用而言,涉及面很小。
  5. 启用新特性:设置 <LangVersion>13</LangVersion> 以使用 C# 13 特性。
  6. 运行测试套件:覆盖单元测试、集成测试和端到端测试的完整回归。
  7. 前后基准测试:使用 BenchmarkDotNet 量化你特定工作负载中的性能提升。

结论

.NET 9 并不是一个抢占头条的革命性版本。它属于那种默默让一切变得更好的版本——你的循环用更少的指令运行,你的类型检查命中快速路径,你的 GC 自适应你的应用,你的 API 规范自动生成。这些改进在每一个 HTTP 请求、每一次数据库查询、每一个 Blazor 渲染周期中叠加起效。

对于仍停留在 .NET 6 或 .NET 7 的团队而言,从 .NET 6 到 .NET 9 的累积差异是巨大的——在常见工作负载上性能提升 20-40%,现代化的 C# 语言,内置的 AI 集成,以及为容器优化的运行时。

在 SplatDev,我们自 2009 年 1.0 版本起就一直基于 .NET 进行构建。我们见证了这个平台从仅限 Windows 成长为真正的跨平台,从闭源走向完全开源,从仅面向企业转向云原生。.NET 9 代表了我们所使用过的最强大的平台版本——而且我们已经在其上运行生产工作负载。

准备好升级你的 .NET 技术栈了吗?SplatDev 提供 .NET 迁移服务、性能优化以及全栈开发——从 nopCommerce 和 Umbraco 到定制企业级应用。

联系我们的 .NET 团队

或直接联系我们:[email protected]

Want more articles like this?

Subscribe for updates on .NET, Umbraco, nopCommerce, and software engineering.

Get in touch →