Microsoft 推出了 .NET 11,这是一个标准长期支持(STS)版本,它将 C# 15 作为默认语言版本。此次更新重点在于通过优化命令行体验并为 AI 智能体与应用程序逻辑交互提供新基础设施,来减少开发者的摩擦。

语言演进与 C# 15

C# 15 带来了联合类型,允许一个值成为声明的一组情况类型中的一种。这使开发者能够在 switch 表达式中通过详尽性检查来处理多种可能的状态,而无需诉诸通用对象类型或无关的基类。

展示 C# 15 联合类型和模式匹配的代码列表。
C# 15 引入联合类型,允许在应用程序逻辑中实现更具表现力且经过编译器检查的模式。devblogs.microsoft.com

此截图展示了 C# 15 中联合类型和封闭层级的实际实现。

此版本还引入了封闭层级,将类的直接派生限制在其声明的程序集内。这为编译器提供了检查特定继承模型模式所需的必要信息,补充了联合类型的灵活性。

“联合类型是其最大的新增功能之一:一个值可以是声明的一组情况类型中的一种,并支持从这些类型转换以及在 switch 表达式中的详尽性检查。”

— Announcing .NET 11 - .NET Blog

优化开发者工作流

为了减少等待工具执行的时间,.NET 11 SDK 现在默认启用 Native AOT CLI 主机。这允许像 'help' 和 'version' 这样的命令在不启动托管 CLI 的情况下运行,同时 MSBuild 服务器在调用之间保持预热,以避免重复的启动工作。

对于基于文件的应用程序,开发者现在可以使用 #:include 指令来跨多个源文件扩展代码。此外,'dotnet watch' 工具已更新,集成了 Aspire 应用主机,并为移动项目提供了崩溃恢复功能。

Runtime Async 与性能改进

最重要的架构转变之一是“Runtime Async”,这是一个将异步挂起和恢复移至运行时的预览功能。通过移除对编译器生成状态机的需求,运行时可以提供更清晰的实时调用堆栈,允许分析程序和调试器显示实际的异步方法,而不是底层的基础设施。

此版本包含数百项运行时优化,包括移除冗余边界检查并改进去虚拟化的 JIT 编译器改进。它还扩展了硬件支持,包括在支持的 x64 和 Arm64 硬件上对 Half 操作提供 FP16 指令。

AI 集成与智能体能力

Microsoft 将 .NET 11 定位为“智能体”开发的基石。SDK 包含一个 MCP(模型上下文协议)服务器模板,帮助 AI 应用程序发现和调用工具,而 Microsoft.Extensions.AI 则提供了用于模型访问的标准抽象,如 IChatClient。

Microsoft Agent Framework (MAF) 基于这些抽象来协调智能体和应用程序代码。这些工具可以与 ASP.NET Core 集成,使用 Agent User Interaction Protocol (AG-UI) 创建交互式的 Blazor 体验。

局限性与权衡

虽然此版本提供了重大升级,但某些功能仍处于预览状态或具有特定限制。例如,Runtime Async 不是默认行为,需要通过 PropertyGroup 手动启用才能使用新的编译模型。

此外,虽然 System.Text.Json 现在支持 F# 判别联合,但此特定实现不支持源代码生成、修剪或 Native AOT。开发者在使用修剪后的应用程序中启用此功能前,必须检查这些记录在案的限制。

Hacker News 读者的反应

  • 技术补充: 一位评论者指出处理 decimals 的特定变化,注意到 .NET 11 与 .NET 10 相比似乎产生了不同的精度结果。 评论 ↗
  • 技术补充: 一位评论者对转向运行时管理的异步执行表示惊讶,质疑这是否意味着使用带栈的协程。 评论 ↗
  • 质疑: 几位评论者对平台的长期可行性表示怀疑,引用了过去被放弃的技术经历以及缺乏跨平台 GUI 栈的情况。 评论 ↗
  • 亲身经验: 一位使用 .NET 进行 AI 后端开发的开发者报告称,该框架对于这些应用非常有效,尤其是在 Linux 容器中运行时。 评论 ↗

以上为 Hacker News 讨论中观点的摘要,并非经过核实的事实。 阅读完整讨论 ↗