.NET 11 Preview 7 发布:一大波硬核更新来袭,离正式版又近了一步!
就在北京时间2026-08-12 凌晨,微软正式发布了 .NET 11 Preview 7。按照往年的节奏,这基本是新版本发布前最后一个大规模塞新特性的预览版了——接下来就是 RC,然后 11 月正式发布。
这一版的分量相当足:C# 终于迎来了带标签的 break/continue,dotnet CLI 换上了 NativeAOT 引擎直接提速 5 倍,Blazor 学会了"摸鱼省电"(自动暂停电路)和输出缓存,ZIP 文件终于支持密码了……
下面挑重点给大家捋一遍。
一、C# 15:千呼万唤的 labeled break/continue 来了
带标签的 break 和 continue
写过嵌套循环的人,谁没为了跳出外层循环搞过 bool found = false 这种 flag 大法?现在不用了:
string? foundValue = null;
outer: for (int x = 0; x < xMax; x++)
{
for (int y = 0; y < yMax; y++)
{
if (GetValue(x, y) is { } value && value == target)
{
foundValue = value;
break outer; // 直接跳出外层循环!
}
}
}
continue 同样支持标签,可以直接跳到外层循环的下一次迭代。Java 程序员表示:欢迎,等你很久了。
Union 类型持续进化
C# 的联合类型(preview 特性)这次改用了 Try-Both 匹配策略:模式匹配时先对 union 实例本身匹配,失败后再匹配内部包裹的值。另外 switch 表达式现在能理解"泛型参数被约束到 closed 类型"的场景——只要封闭基类的所有子类型都被覆盖,编译器就不再报"非穷尽"警告:
public closed record class Shape;
public record class Circle(double Radius) : Shape;
public record class Square(double Side) : Shape;
static double Area<T>(T shape) where T : Shape => shape switch
{
Circle(var r) => Math.PI * r * r,
Square(var s) => s * s // 不再警告,编译器知道 T 玩不出新花样
};
提醒:union、labeled break/continue 等都还是预览特性,需要
<LangVersion>preview</LangVersion>开启。
二、运行时:Runtime Async 继续狂飙
Runtime Async(运行时原生异步)是 .NET 11 的"头号工程",这一版又压榨出不少性能:
- 异步方法进入分层编译(Tiered Compilation):以前异步方法永远跑 Tier0 代码,现在能正常走 Tier0→Tier1 流水线。TechEmpower
platform-json基准测试中,预热阶段的最大分配速率从 1.1 亿 B/s 暴降到 800 万 B/s,降幅超过 92%。 - JIT 内联 TransparentAwait:对已完成的 Task 做热
await,从辅助调用折叠成一次状态标志位检查——循环 await 一亿次的耗时从 191ms 降到 32ms。 - Task/ValueTask 工厂方法内建识别:
Task.FromResult、ValueTask.CompletedTask等直接被 JIT 折叠成快速路径;Task和ValueTask之间的包装转换也能被拆包,某场景下生成代码从 115 字节缩到 29 字节。 await Task.Yield()去掉了线程池装箱分配:循环 1000 万次从 723ms 降到 534ms,追平了传统状态机模型。
CoreCLR on WebAssembly:里程碑达成
Preview 6 里 CoreCLR 跑在 WASM 上还只能"开机",Preview 7 已经可以端到端跑完整个运行时库测试套件了。背后是异常处理迁移到标准化的 exnref 提案、RyuJIT 点亮了大部分 PackedSimd 指令、新增 WASI 宿主等一连串工作。Blazor WebAssembly 用上 CoreCLR 的日子越来越近了。
JIT 其他亮点
- 新增 AVX-VNNI V512 硬件内建指令支持
- Arm64 上
PopCount/TrailingZeroCount编译成单条cnt/ctz指令 Activator.CreateInstance<T>()的结果现在可以被去虚拟化,后续虚调用直接内联- Arm64 SVE 下
Vector<T>不再被限制在 128 位 - 修复了一个存在已久的坑:
float/double到小整数类型的未检查转换现在正确饱和(以前(short)32768.0会得到-32768……)
NativeAOT
- 泛型虚方法(GVM)分发改走 dispatch cell:单态调用从 2.45ns 降到 1.74ns
- ILC 编译提速:
dotnet new webapiaot模板编译从 7.4s 降到 6.2s - Arm64 指针认证(PAC-RET)支持落地,ROP 攻击更难了
Assembly.GetCallingAssembly()在 NativeAOT 下可用了(但需要堆栈跟踪数据)
三、基础库:一堆"终于等到你"
IEEE 754 十进制浮点三兄弟
System.Numerics 新增 Decimal32、Decimal64、Decimal128,分别提供 7、16、34 位十进制精度。和 System.Decimal 不同,它们采用 IEEE BID 编码、支持无穷大和 NaN,并且完整接入泛型数学(IDecimalFloatingPointIeee754<TSelf>)。金融计算、科学计算多了新选择。
ZIP 终于支持密码了!
是的,2026 年了,System.IO.Compression 终于可以读写加密的 ZIP 条目了,支持 ZipCrypto 和 AES-128/192/256:
using var archive = ZipFile.Open("secrets.zip", ZipArchiveMode.Create);
ZipArchiveEntry entry = archive.CreateEntry(
"notes.txt",
password: "correct horse battery staple",
encryptionMethod: ZipEncryptionMethod.Aes256);
同时还新增了 ZipFileCreationOptions / ZipExtractionOptions 批量操作选项和全套异步 API。
HTTP 请求压缩与智能连接淘汰
- 新增
GZipCompressedContent、BrotliCompressedContent、ZstandardCompressedContent三个HttpContent包装器,上行请求体也能压缩了。 SocketsHttpHandler新增实验性回调ShouldEvictConnection:以前为了让HttpClient感知 DNS 变更,只能粗暴设置PooledConnectionLifetime定期回收所有连接;现在可以只在 DNS 真的变了的时候才踢掉旧连接,健康连接不再被误杀。
类型化 DNS 解析 API
Dns.ResolveSrv、ResolveMx、ResolveTxt、ResolveCName 等全新 API 上线,返回强类型记录。目前仅 Windows 实现(基于 DnsQueryEx),其他平台后续预览版补上。
System.Text.Json:封闭层级自动多态
开启 InferClosedTypePolymorphism 后,C# closed 类型层级不再需要手写 [JsonDerivedType],序列化器自动发现派生类型并分配判别符。
其他值得知道的
Complex<T>泛型复数类型:可以用float、Half、BFloat16甚至新的Decimal128做复数运算string.ToUpperOrdinal()/ToLowerOrdinal():与OrdinalIgnoreCase配套的区域性无关大小写转换,和"土耳其 i 问题"说再见ChangeToken.OnChange支持Func<Task>异步回调,配置文件热重载不再跑async voidHybridCache工厂回调可感知上下文:根据算出来的结果动态调整过期时间和本地缓存大小System.IO.Pipelines降低读写竞争:56 核机器上 ASP.NET Core JSON 基准的锁竞争从每秒 483 次降到 66 次- ⚠️ 注意:
Math.Round多位数重载现在严格精确舍入,约 5% 的输入会得到和之前不同的(但正确的)结果
四、SDK:dotnet CLI 换上 NativeAOT 引擎
NativeAOT CLI 默认开启
这可能是你每天都能感知到的变化:dotnet 命令行的 AOT 快速路径从 Preview 6 的实验选项变成默认开启。实测数据:
dotnet tool list:378ms → 68ms(快 5.5 倍)dotnet dev-certs https、dotnet ef等工具调度命令:约 700ms → 200ms 左右(快 3 倍多)
原理是跳过了第二次 CoreCLR 启动。想退回老行为?DOTNET_CLI_ENABLEAOT=false 即可。目前 build、run、test、pack、publish 等依赖 MSBuild 的命令仍走托管 CLI,后续会继续迁移。
MSBuild Server 默认开启
后台常驻一个"热乎"的 MSBuild 工作进程,连续的 dotnet build / dotnet test 不用重复启动 MSBuild。老行为可通过 DOTNET_CLI_USE_MSBUILD_SERVER=false 恢复。
dotnet test 全面加强
- 新增运行级
--timeout 90s和--maximum-failed-tests 5(跑挂 5 个就止损) - 支持直接对
Microsoft.Build.Traversal项目跑测试 --list-tests json输出结构化测试清单,方便工具消费- 多模块运行自动合并 TRX 和覆盖率产物
- 获得 MAUI 设备测试能力:
--list-devices发现设备、--device先部署再测试
文件化应用(File-based Apps)更顺手
dotnet reference add --file app.cs MyLib/MyLib.csproj 可以直接往 .cs 文件里插入 #:project 指令,单文件应用引用项目不用再手敲了。
容器发布
优先使用平台原生容器运行时——Windows 上用 wslc,macOS 上用 container,Docker 和 Podman 退居备选。
五、ASP.NET Core 与 Blazor:省电、缓存、更聪明
Blazor 电路自动"摸鱼"
Interactive Server 模式下,当浏览器标签页被切到后台,电路可以自动暂停释放服务器资源,用户切回来再恢复。引入 Microsoft.AspNetCore.Components.Server.AutoPause 包:
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode()
.WithBrowserOptions(options =>
{
options.AddAutoPause(pause =>
{
pause.HiddenDelay = TimeSpan.FromSeconds(30); // 默认 2 分钟
});
});
很贴心的是,如果用户正在输入、视频正在播放、或者有进行中的 JS 互操作,暂停会自动延后,不会丢数据。
CacheView:SSR 输出缓存
新组件 CacheView 可以缓存服务端渲染子树的 HTML 输出,命中缓存时内部组件完全不实例化,直接回放 HTML:
<CacheView ExpiresAfter="TimeSpan.FromMinutes(10)"
VaryByRoute="productId"
VaryByQuery="page,pageSize"
VaryByCulture="true">
<ExpensiveProductSummary ProductId="productId" />
</CacheView>
支持绝对/滑动过期、按路由/查询字符串/请求头/Cookie/用户/区域文化等多维度缓存键;注册了 HybridCache 还会自动升级为两级缓存。AuthorizeView、QuickGrid 这类依赖每请求状态的组件有内置标注,放错位置会给出明确的报错提示。
五个新的 Blazor 分析器
BL0012~BL0016 默认开启,专治各种常见坑:多余的 StateHasChanged() 调用、忘了订阅认证状态变更、for 循环变量被闭包捕获、非 public 的 [JSInvokable]、没包 try/catch 的 JS 互操作调用。
验证体系大完善
ValidatableTypeAttribute/SkipValidationAttribute摘掉实验标签- 验证消息内置本地化:注册
IStringLocalizerFactory即自动生效,不再需要单独的 Localization 包 - Blazor SSR 客户端验证的 CSS 类名和行为与交互式 Blazor 完全对齐
其他
- OpenAPI 3.2 支持用
itemSchema描述 SSE(Server-Sent Events)流的事件结构 - SignalR .NET 客户端支持重定向后的认证刷新(为 Azure SignalR 铺路)
- 可通过
ITlsConnectionFeature读取 TLS 通道绑定令牌,防中继攻击 QuickGrid新增InitialItemIndex和ScrollToItemAsync(虚拟化模式下)wasm-tools升级到 Emscripten 6
六、EF Core:查询翻译大丰收
这一版 EF Core 的查询翻译改进相当亮眼,而且不少来自社区贡献:
int.Parse等解析方法可翻译为 SQL ServerCAST,不再被迫客户端求值- GroupBy 聚合穿越导航属性:
g.Max(o => o.Customer.Region)从"每组一次相关子查询"回归为单条 LEFT JOIN + GROUP BY,修掉了一个 EF Core 7 时代的性能回退 GroupBy+ 每组取First之后还能继续组合查询(以前直接报翻译失败)LEFT JOIN无匹配行时,匿名类型/DTO 投影正确产出null而不是抛Nullable object must have a value- Cosmos DB Provider 全面现代化:物化器改用
Utf8JsonReader,彻底告别 Newtonsoft.Json,查询重试也纳入执行策略 - SQLite 支持
Half类型;PMC 的Add-Migration/Update-Database支持-NoBuild
⚠️ 注意:Microsoft.Data.Sqlite 不再支持 netstandard2.0(也就是不再支持 .NET Framework),最低目标框架为 net10.0。
七、.NET MAUI:Passkey、增量热重载、Shell 路由模板
跨平台 Passkey 认证
新的 Passkeys Essentials API 一套代码驱动 Android 14+、iOS 16+、Mac Catalyst 16+、Windows 10 1903+ 的原生 Passkey 界面:
if (Passkeys.IsSupported)
{
var credential = await Passkeys.CreateAsync(optionsJson); // 注册
var assertion = await Passkeys.AssertAsync(optionsJson); // 登录
}
XAML 增量热重载(预览特性)
基于源生成器 + MetadataUpdateHandler,不重建应用就能更新已实例化的页面,Debug 构建默认开启。
Shell 路由模板
Shell 路由用上了 ASP.NET Core 风格的路径参数,支持必填、可选、默认值、约束和 catch-all:
Routing.RegisterRoute("product/{sku}", typeof(ProductDetailPage));
await Shell.Current.GoToAsync("//products/product/seed-tomato");
其他
{RelativeSource AncestorType=...}绑定编译为 AOT 安全的 TypedBinding- iOS/Mac Catalyst 上 NavigationPage、TabbedPage 切换到 Handler 架构
- 第三方平台后端扩展点开放(GTK、macOS、WPF 社区后端可以正式接入了)
- Android FastDeploy2 成为默认,热增量部署最少只需 3 个串行 adb 操作
dotnet watch热重载支持通过 USB/Wi-Fi 连接真机 iOS/tvOS 设备- IPA 默认携带
*.symbols,App Store Connect 崩溃报告自动符号化
八、F# 也有份
- 计算表达式里
let右侧现在可以直接写let!/use!/do!(以前报 FS0750) - 递归模块/命名空间内的特性(Attribute)可以正常解析
- 无负载结构联合体的
StructLayout尺寸修正
九、上手方式
- 下载 .NET 11 Preview 7 SDK:https://dotnet.microsoft.com/download/dotnet/11.0
- Windows 用户搭配 Visual Studio 2026 Insiders;VS Code 用户装最新 C# Dev Kit
- 语言预览特性记得开
<LangVersion>preview</LangVersion>
⚠️ 升级提醒:本版有一些破坏性变更,比较值得注意的包括——Preview 6 的 Virtualize API 改名(InitialIndex → InitialItemIndex)、压缩选项里的 WindowLog 统一改名 WindowLog2、EditContext.Validate 标记过时、--no-build 不再隐式构建项目引用、CSRF 中间件只验证显式 opt-in 的端点等。升级前建议先过一遍官方发布说明的 Breaking changes 部分。
写在最后
Preview 7 基本就是 .NET 11 正式版前最后一次"大放送"了。纵观整个 .NET 11:Runtime Async 从 P1 一路打磨到现在反超状态机模型,CoreCLR 即将登陆 WebAssembly,CLI 全面 NativeAOT 化,C# 补上了 labeled break/continue 和 union 类型——这个 11 月的 STS 版本,诚意十足。
你最期待哪个特性?欢迎在评论区聊聊。
本文内容整理自微软官方 .NET 博客及 dotnet/core 仓库发布说明。
欢迎大家扫描下面二维码成为我的客户,扶你上云

浙公网安备 33010602011771号