← 返回首页目录
# .NET 9 全新特性全面解析

作者:吉祥法师

## 引言

.NET 9 作为 .NET 8 的继任者,将核心研发方向聚焦于云原生应用和高性能计算领域。作为标准期限支持(STS)版本,.NET 9 将获得为期两年的官方技术支持。该版本不仅在运行时和库层面带来了大量性能优化,更在人工智能、跨平台开发等前沿领域迈出了重要一步。本文将系统梳理 .NET 9 在各技术栈中的关键更新,帮助开发者全面把握这一重要版本的核心价值。

## .NET 运行时核心改进

### 功能开关与特性切换新模型

.NET 9 运行时引入了一套全新的特性开关属性模型,该模型内置对裁剪(Trimming)操作的原生支持。这一设计使得类库开发者能够通过定义标准化的特性开关,灵活控制库中不同功能区域的启用状态,从而在应用部署时精准裁剪不需要的代码路径,显著减小最终发布包的体积。

### 垃圾回收动态适应机制

垃圾回收器(GC)迎来了革命性的改进:新增的动态适应应用大小(Dynamic Adaptation to Application Size)功能现已成为默认配置,取代了原先的服务器模式GC。这一机制能够根据应用实际运行时的内存压力和分配模式,自动调整GC的工作策略和堆大小配置,使应用在不同负载场景下都能获得最优的内存管理效率。

### 性能深度优化

运行时层面的性能优化涵盖多个维度,包括循环结构优化、方法内联策略改进,以及针对 ARM64 架构的向量化和代码生成增强。这些底层优化直接转化为应用程序吞吐量的提升和启动时间的缩短,尤其对运行在 ARM 架构云服务器上的工作负载带来显著收益。

## .NET 库新增功能

### System.Text.Json 增强

序列化库 System.Text.Json 新增了对可空引用类型注解的支持,使序列化过程能够感知并正确处理C#可空性上下文。同时,新版本支持从类型定义直接导出 JSON Schema 文档,极大简化了 API 契约文档的生成流程。在输出控制方面,新增的自定义选项允许开发者灵活控制 JSON 的缩进格式,并支持从单一数据流中读取多个根级 JSON 值。

### LINQ 新方法:CountBy 与 AggregateBy

LINQ 家族新增了 `CountBy` 和 `AggregateBy` 两个方法,它们允许开发者按指定键直接进行状态聚合,无需像传统方式那样通过 `GroupBy` 分配中间分组对象。这不仅简化了代码逻辑,更避免了不必要的内存分配,提升了大数据集处理时的性能表现。

### PriorityQueue 功能扩展

`System.Collections.Generic.PriorityQueue` 类型新增了 `Remove` 方法,允许开发者直接更新队列中现有元素的优先级。这一能力使优先队列从静态数据结构进化为支持动态调整的动态结构,适用于任务调度、图算法等需要实时调整优先级的场景。

### 密码学与反射增强

密码学领域新增了 `CryptographicOperations` 类型上的一次性哈希方法,提供更安全便捷的哈希计算入口。此外,新加入的 KMAC 算法类迎合了最新的密码学标准需求。

反射方面,全新的 `PersistedAssemblyBuilder` 类型支持将动态生成的程序集保存到磁盘,并具备完整的 PDB 符号文件支持,使得开发者可以调试自己生成的程序集代码。

### TimeSpan 新构造方法

`TimeSpan` 类新增了多个 `From*` 方法,允许直接从 `int` 类型(而非原先必须的 `double`)创建时间间隔对象。这一改变有效规避了浮点数运算固有精度误差可能导致的逻辑错误,提升了时间计算的准确性。

## .NET SDK 开发工具链升级

### 工作负载集合管理

. NET 9 SDK 引入了工作负载集(workload sets)概念,将所有已安装工作负载固定到单一特定版本,除非开发者显式更新,否则不会发生隐性版本漂移。这为团队协作和持续集成环境提供了确定性保障。

### 点网工具运行策略

`dotnet tool install` 命令新增选项,将“是否允许工具在更高版本运行时上运行”的决策权从工具作者转移给最终用户。这一变化带来了更灵活的兼容性处理方案。

### 构建与测试体验优化

单元测试获得了更完善的 MSBuild 集成支持,可实现并行测试执行。终端记录器(Terminal Logger)默认启用,并在可用性上进一步优化——构建结束时将以摘要形式清晰呈现失败与告警的总数。新增的 MSBuild 脚本分析器实现了“构建检查”功能,SDK 能自动检测并调整 .NET SDK 与 MSBuild 之间的版本不匹配问题。值得注意的还有 `dotnet workload history` 命令,它完整记录并展示当前 SDK 安装环境下的工作负载安装与变更历史。

## 人工智能基础设施构建

### 统一AI抽象层

.NET 9 最具战略意义的举措之一是推出了统一的 C# 抽象层,通过 `Microsoft.Extensions.AI` 和 `Microsoft.Extensions.VectorData` 两个包实现。这套抽象层为开发者提供了与各类 AI 服务交互的一致编程接口,涵盖小型/大型语言模型(SLM/LLM)、嵌入向量、向量存储以及中间件等AI应用核心组件。这一设计消除了不同 AI 供应商 SDK 之间的割裂,使开发者能够以可移植的方式构建 AI 应用。

### 张量计算全面升级

张量(Tensor)是 AI 计算的核心数据结构,.NET 9 通过 `TensorPrimitives` 和全新 `Tensor` 类型显著扩展了这一领域的能力边界:

**TensorPrimitives 扩展:** 方法重载数量从原先的 40 个猛增至接近 200 个,覆盖了类似于 `Math`、`MathF` 数值运算功能的跨度(span)版本。大量操作现已采用 SIMD 优化指令,实现了显著的性能飞跃。泛型重载支持任何实现了指定接口的类型 `T`,使用场景不再局限于浮点数数组。

**Tensor 类型:** 构建于 TensorPrimitives 之上,提供高效的数学运算支持。该类型实现了与主流 AI 库(ML.NET、TorchSharp、ONNX Runtime)的零拷贝高效互操作,并通过索引和切片操作简化数据处理流程。在 .NET 9 中,Tensor 仍标记为实验性 API。

### ML.NET 4.0

ML.NET 作为 .NET 生态的机器学习框架,4.0 版本带来了多项重要改进:支持编程式配置 `MLContext` 选项的新方式、可加载 ONNX 模型为 `Stream`、DataFrame 功能增强,以及分词器能力升级。实验性功能包括基于 TorchSharp 的 Llama 和 Phi 模型系列移植,以及 CausalLM 流水线 API。

### 分词器库扩展

`Microsoft.ML.Tokenizers` 库是处理文本与 Token 之间转换的关键工具,在 AI 场景中对于上下文管理、成本计算和文本预处理至关重要。最新版本新增了对以下模型家族的分词支持:

- **Tiktoken**:适用于 GPT 系列模型(包括 GPT-3、3.5、4、4o、o1)
- **Llama**(基于 SentencePiece):支持 Llama 和 Mistral 模型
- **CodeGen**:适配如 codegen-350M-mono 这类的代码生成模型
- **Phi2**(基于 CodeGen):面向微软 Phi2 模型
- **WordPiece Bert**:支持 Bert 类模型,例如 optimum-all-MiniLM-L6-v2 模型

## Aspire 应用开发框架

Aspire 9 作为构建可观测、生产级云原生应用的综合性工具集,在仪表盘体验和资源生命周期管理方面均有显著改进,并新增了多个集成组件和 API 以提供更灵活的开发体验。该版本同时兼容 .NET 9 和 .NET 8 应用。

## Web 开发:ASP.NET Core

### 安全与性能的默认强化

基于 .NET 9 构建的 ASP.NET Core 应用在默认安全配置上更进一步,同时扩展了对预编译(Ahead-of-Time,AOT)技术的支持,并加强了监控与追踪能力。性能优化使得应用可达到更高的吞吐量、更快的启动速度和更低的内存占用。

### 核心功能亮点

- **静态文件优化:** 在构建和发布环节实现 JavaScript、CSS 等静态资源的自动化指纹版本管理
- **Blazor 增强:** 新增混合型(Hybrid)和 Web 应用模板,支持组件渲染模式检测,服务器端渲染下提供全新的重新连接体验
- **API 开发支持:** 内置基于 `Microsoft.AspNetCore.OpenAPI` 的 OpenAPI 文档生成,原生 AOT 支持得到增强
- **安全加固:** 提供认证与授权的新 API
- **开发者体验:** 简化了 Linux 环境下信任开发证书的配置流程,便于本地 HTTPS 开发调试

## 跨平台应用开发:.NET MAUI

.NET MAUI 9 的研发重点集中在性能与可靠性的提升,以及桌面与移动应用的深度整合。iOS 和 Mac Catalyst 平台上的 CollectionView 与 CarouselView 获得了性能更优的全新实现,现有控件得到更新,新增应用生命周期事件,并在 Native AOT 和裁剪方面取得突破以减少应用体积和加快启动速度。

亮点功能包括:Windows 平台新增 TitleBar 桌面控件;`HybridWebView` 控件简化了 ReactJS、Vue.js、Angular 等 JavaScript 框架内容的嵌入;Entry 控件支持更多键盘模式;控件处理器在可能时自动断开连接。此外,`MainPage` 属性已弃用,推荐通过重写 `Application.CreateWindow(IActivationState)` 方法来设定应用主页面。

## 数据访问:EF Core 9

Entity Framework Core 9 重点更新了 Azure Cosmos DB for NoSQL 的数据库提供程序,使其能更好地满足 NoSQL 云数据库场景需求。同时,在 AOT 编译支持和预编译查询方向迈出了重要步伐,并对其他多个方面进行了改进。

## 语言更新:C# 13

随 .NET 9 SDK 发布的 C# 13 引入了多项语言新特性:

- **params 集合**:更加灵活的参数数组支持
- **新 lock 类型与语义**:改进的线程同步机制
- **\e 转义序列**:统一的转义字符表示方式
- **方法组自然类型改进**:更好的类型推断
- **对象初始化器中的隐式索引器访问**:便捷的索引器初始化语法
- **在迭代器和异步方法中使用 ref 局部变量与不安全上下文**
- **允许 ref struct 类型实现接口**
- **泛型类型参数支持 ref struct 实参**
- **分部属性和索引器**:支持在分部类型中声明
- **重载解析优先级**:允许库作者指定更优重载
- **预览特性——字段后备属性(field backed properties)**

## 语言更新:F# 9

F# 9 同样随 .NET 9 SDK 推出,核心新特性包括:

- 可空引用类型支持
- 可区分联合的 `.Is*` 属性
- 部分活动模式可返回 `bool` 替代 `unit option`
- 提供参数时优先使用扩展方法而非内置属性
- 空表达式计算表达式
- 哈希指令支持非字符串参数
- fsi 的 `#help` 指令扩展,可在 REPL 中展示文档
- `#nowarn` 支持使用 FS 前缀的错误代码
- 对非递归函数或 let 绑定值上的 `TailCall` 属性提供警告
- 强制属性目标
- 集合随机函数支持
- F# 列表和集合支持 C# 集合表达式

## 桌面开发:WPF 与 WinForms

### WPF 主题与现代化

WPF for .NET 9 增强了对现代应用构建的支持,核心更新包括:支持 Windows Fluent 主题、适配 Windows 浅色与深色模式、支持 Windows 强调色的主题适配,以及改善了对连字(hyphen-based ligatures)的字体渲染支持。值得注意,BinaryFormatter 已不再受支持。

### WinForms 异步与现代主题

WinForms 9 带来了多个方面的演进:Form 和 TaskDialog 现已支持 `ShowDialogAsync` 异步方法(实验性功能);BinaryFormatter 同样不再支持;提供 Windows 暗色模式渲染的实验性支持;FolderBrowserDialog 和 ToolStrip 控件获得小幅改进。System.Drawing 库经历了大量更新,包括封装 GDI+ 效果、支持 `ReadOnlySpan` 以及优化互操作代码生成。

## 总结

.NET 9 是一次全方位、深层次的技术升级,从运行时的底层性能优化到 AI 基础设施的前瞻性布局,从 C#/F# 语言的表达力提升到 Web、桌面、移动、云原生各领域的框架演进,均体现了微软对现代应用开发需求的深刻洞察。特别是 AI 统一抽象层的建立,正在将 .NET 打造为 AI 应用开发的首选平台之一。对于寻求构建高性能云原生应用、探索 AI 功能集成,或希望提升开发效率的团队而言,.NET 9 是一个值得积极采纳的重要版本。