微软正式发布了 .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.ResolveSrv、ResolveMx、ResolveTxt、ResolveCName 等强类型 DNS API(当时仅 Windows 实现),这一版 Linux 也安排上了,基于平台解析器配置,还支持自定义 DNS 服务器列表。微服务和服务发现场景实用性拉满。
JSON:新数值类型 + Union 序列化
System.Text.Json 内置了 BFloat16、Decimal32、Decimal64、Decimal128 的转换器(反射和源生成都支持)。同时 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%DeflateEncoder、GZipDecoder等无流编解码器新增Reset(),处理多个载荷不用反复分配- Unix 上支持 TLS channel binding 校验,为 ASP.NET Core 的 Negotiate 认证扩展保护(Extended Protection)铺路
- Apple 平台上
AesGcm、ChaCha20Poly1305走 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 仍有几处值得注意的破坏性变更------
- 数值转换严格正确舍入 :
decimal与二进制浮点之间的转换改为"精确值一次舍入"。double字面量1.23转decimal不再恰好得到1.23,且没有兼容开关------依赖旧结果的测试和序列化数据需要更新 - HTTP 高基数指标改为可观测仪表 :直接用
MeterListener的代码需要调用RecordObservableInstruments才能收到open_connections、active_requests的测量值 Configuration环境变量成为 CLI 默认值 :脚本里如果设置了环境变量Configuration,dotnet 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 仓库发布说明。