.NET 11 RC1 发布:拿到"准生证",生产环境可以上了!

微软正式发布了 .NET 11 的第一个候选发布版本(Release Candidate 1)

和之前的 Preview 不同,RC1 附带了 go-live 支持许可证------这意味着你可以放心地把它用在生产环境,遇到问题能获得官方支持。按照惯例,接下来就是 RC2,然后 11 月正式 GA。作为 STS(标准期限支持)版本,.NET 11 将获得 2 年支持。

工具链方面,.NET 11 RC1 由全新的 Visual Studio 2026 Insiders 提供支持,VS Code 用户则搭配最新的 C# Dev Kit 扩展即可。

这一版都有哪些新东西?挑重点给大家捋一遍。

一、C# 15 正式转正,不用再开 preview 开关了

RC1 最重要的信号之一:面向 .NET 11 的项目,默认语言版本就是 C# 15。整个预览周期里打磨的语言特性全部转正:

  • 联合类型(union types)
  • 带标签的 break / continue
  • 集合表达式参数(collection expression arguments)
  • 非虚静态接口成员
  • 封闭类层级(closed class hierarchies)
  • 扩展索引器

Union 类型毕业

以前想表达"一个方法可能返回成功或失败",要么搞异常,要么手写 OneOf 风格的包装类。现在原生支持,而且不再需要 <LangVersion>preview</LangVersion>

csharp 复制代码
public record Success(string Message);
public record Failure(int ErrorCode);

public union Result(Success, Failure);

static string Describe(Result result) => result switch
{
    Success(var message) => message,
    Failure(var errorCode) => $"Error {errorCode}"
};

带标签的 break/continue

写过嵌套循环的人,谁没为了跳出外层循环搞过 bool found = false 的 flag 大法?现在可以直接:

csharp 复制代码
outer: for (int x = 0; x < xMax; x++)
{
    for (int y = 0; y < yMax; y++)
    {
        if (GetValue(x, y) == target)
        {
            break outer;   // 直接跳出外层循环!
        }
    }
}

Unsafe Evolution 继续打磨(仍为预览特性)

内存安全规则(updated-memory-safety-rules)这一版补齐了几块拼图:await 现在可以出现在 unsafe 上下文里;safe 关键字可以标注在 LibraryImport 这类生成代码上;而给委托、静态构造函数、析构函数标 unsafe 则会直接报错------因为它们本来就不构成有意义的 unsafe 上下文。


二、基础库:跨平台能力大补课

进程信号与退出状态

Process 终于原生支持发送 POSIX 信号和检查终止状态了,不用再绕 SafeProcessHandle

csharp 复制代码
using System.Diagnostics;
using System.Runtime.InteropServices;

if (OperatingSystem.IsLinux() || OperatingSystem.IsMacOS())
{
    using Process process = Process.Start("sleep", "30")!;
    process.Signal(PosixSignal.SIGTERM);
    ProcessExitStatus status = await process.WaitForExitStatusAsync();
    Console.WriteLine(status);
}

ProcessExitStatus 能区分"正常退出"和"被信号干掉",做进程管理的同学狂喜。

Linux 上的类型化 DNS 解析

Preview 7 引入的 Dns.ResolveSrvResolveMxResolveTxtResolveCName 等强类型 DNS API(当时仅 Windows 实现),这一版 Linux 也安排上了,基于平台解析器配置,还支持自定义 DNS 服务器列表。微服务和服务发现场景实用性拉满。

JSON:新数值类型 + Union 序列化

System.Text.Json 内置了 BFloat16Decimal32Decimal64Decimal128 的转换器(反射和源生成都支持)。同时 JSON 基础设施完成了对 C# union 类型的支持------通过结构分类器,可以按"区分属性"自动判断该反序列化成 union 的哪个 case:

csharp 复制代码
[JsonUnion(TypeClassifier = typeof(JsonUnionTypeStructuralClassifier))]
public union PetUnion(Dog, Cat);

另外,封闭类型层级的多态序列化现在可以通过 [JsonPolymorphic(InferClosedTypePolymorphism = true)] 按类型逐个开启,库作者不用强迫使用者改全局 JsonSerializerOptions 了。

异步选项验证

配置验证支持异步了:实现 IAsyncValidateOptions<TOptions>,启动时就能做"DNS 解析得通才算配置合法"这类检查。相应地,IStartupValidator 被标记过时,由 IAsyncStartupValidator 接替。

小而美的改进

  • BitArray 可以直接从 ReadOnlySpan<bool/byte/int> 构造------Arm64 基准快 33~51%,布尔输入的分配最多降低 89%
  • DeflateEncoderGZipDecoder 等无流编解码器新增 Reset(),处理多个载荷不用反复分配
  • Unix 上支持 TLS channel binding 校验,为 ASP.NET Core 的 Negotiate 认证扩展保护(Extended Protection)铺路
  • Apple 平台上 AesGcmChaCha20Poly1305 走 CryptoKit 空 AAD 快速路径,16 字节小载荷加密提速约 25%
  • Aes 新增 RFC 3394 无填充 Key Wrap 支持(JOSE 库常用)

还有一个实验性大招:System.Net.Security 提供了调用方驱动的非阻塞 TLS 状态机TlsBufferSession / TlsSocketSession),应用自己控制缓冲区和 I/O 调度------做高性能网络中间件的可以关注,注意 API 带 SYSLIB5007 实验诊断。


三、运行时

  • Unix 进程内崩溃报告:崩溃时能从进程内部直接产出诊断信息
  • Half 运算用上 FP16 硬件指令:半精度浮点操作在支持的芯片上直接硬加速

回顾整个 .NET 11 周期,运行时的"头号工程" Runtime Async (运行时原生异步)已经从 Preview 1 一路打磨到反超传统状态机模型:异步方法进入分层编译后,TechEmpower JSON 基准预热阶段的分配速率暴降 92%;热路径 await 内联后循环一亿次从 191ms 降到 32ms。再加上 CoreCLR on WebAssembly 已能端到端跑完整个运行时库测试套件------Blazor WebAssembly 换上 CoreCLR 的日子越来越近了。


四、SDK 与 CLI

dotnet test 全面加强

RC1 的 dotnet test(Microsoft.Testing.Platform 路径)新增两组运行级 控制(放在 -- 之前对整个运行生效):

bash 复制代码
# 整个测试运行最多 90 秒
dotnet test --timeout 90s

# 挂 5 个就止损
dotnet test --maximum-failed-tests 5

移动测试也支棱起来了:支持 Android、iOS、macOS、Mac Catalyst 目标,可以选择真机、模拟器,还有配套的 dotnet new androidtest / iostest 等模板。多模块运行时可以用 --results-directory-layout per-module 防止同名报告互相覆盖。

容器发布:可复现 + 跳过冗余上传

  • 设置 SOURCE_DATE_EPOCH 后,相同输入的多次发布会产出相同的镜像摘要(digest),供应链审计友好
  • 推送到远端仓库前会先检查 manifest 是否已存在,已存在则跳过层处理只打标签,重复推送快得多

文件化应用(File-based Apps)继续进化

单文件 app.cs 的 Native AOT 启动路径现在能复用已有构建产物 ------没改代码就不用重编译。dotnet format app.cs 也可以直接格式化单文件应用了。

dotnet format 提速

文件夹模式下,dotnet format 只沿"将被格式化的文件"的祖先目录查找 .editorconfig,不再扫描 node_modules 这种无关子树。某 monorepo 基准里,格式化单个文件从 1.09 秒降到 0.55 秒。


五、ASP.NET Core

  • SignalR 认证刷新 API 定型:服务端 API 和 TypeScript 客户端双双支持认证刷新,Blazor Server 电路在认证刷新后也会自动更新------为 Azure SignalR 等场景铺路
  • OpenAPI 会如实反映 [Obsolete] 标记的 API,并且可以为构建期 OpenAPI 生成选择环境
  • Negotiate 认证使用 TLS channel binding(配合前面提到的 Unix 端支持),防中继攻击

回望 Preview 7 里那些大货------Blazor 电路自动暂停省电、CacheView SSR 输出缓存、五个新 Blazor 分析器(BL0012~BL0016)、验证体系本地化内置------都已在 RC1 中趋于稳定。


六、MAUI 与桌面端

  • .NET MAUI:RC1 聚焦测试能力(对接 dotnet test 的设备测试)、控件与平台功能完善、XAML 改进;跨平台 Passkey、XAML 增量热重载、ASP.NET Core 风格的 Shell 路由模板等 Preview 7 重磅特性全部带上
  • Windows Forms:新增 kiosk(信息亭)模式管理能力,现代视觉风格(Modern visual styles)在 RC1 正式稳定

七、上手方式

  • 下载 .NET 11 SDK(RC1):https://dotnet.microsoft.com/download/dotnet/11.0
  • Windows 用户推荐搭配 Visual Studio 2026 Insiders ;VS Code 用户安装最新 C# Dev Kit
  • 想看新特性演示,可以蹲每周的 .NET 社区 standup 和 .NET Unboxed 直播

升级提醒:RC1 仍有几处值得注意的破坏性变更------

  1. 数值转换严格正确舍入decimal 与二进制浮点之间的转换改为"精确值一次舍入"。double 字面量 1.23decimal 不再恰好得到 1.23且没有兼容开关------依赖旧结果的测试和序列化数据需要更新
  2. HTTP 高基数指标改为可观测仪表 :直接用 MeterListener 的代码需要调用 RecordObservableInstruments 才能收到 open_connectionsactive_requests 的测量值
  3. Configuration 环境变量成为 CLI 默认值 :脚本里如果设置了环境变量 Configurationdotnet build/test 会默认采用它而不是 Debug,需要时显式传 --configuration Debug

升级前建议通读一遍官方发布说明的 Breaking changes 部分。


写在最后

从 Preview 1 到 RC1,.NET 11 的拼图基本完整了:Runtime Async 反超状态机模型、CoreCLR 登陆 WebAssembly、CLI 全面 NativeAOT 化(dotnet tool list 快 5.5 倍)、C# 15 补齐 union 和 labeled break/continue、ZIP 加密、Blazor 省电摸鱼......

RC1 拿到 go-live 许可,意味着正式版已没有悬念,只剩抛光。这个 11 月的 STS 版本,诚意十足。

你最期待哪个特性?欢迎在评论区聊聊。

本文内容整理自微软官方 .NET 博客及 dotnet/core 仓库发布说明。