
就在北京时间2026-08-12 凌晨,微软正式发布了 .NET 11 Preview 7。按照往年的节奏,这基本是新版本发布前最后一个大规模塞新特性的预览版了——接下来就是 RC,然后 11 月正式发布。
这一版的分量相当足:C# 终于迎来了带标签的 break/continue,dotnet CLI 换上了 NativeAOT 引擎直接提速 5 倍,Blazor 学会了"摸鱼省电"(自动暂停电路)和输出缓存,ZIP 文件终于支持密码了……
下面挑重点给大家捋一遍。
写过嵌套循环的人,谁没为了跳出外层循环搞过 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 程序员表示:欢迎,等你很久了。
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(运行时原生异步)是 .NET 11 的"头号工程",这一版又压榨出不少性能:
platform-json 基准测试中,预热阶段的最大分配速率从 1.1 亿 B/s 暴降到 800 万 B/s,降幅超过 92%。await,从辅助调用折叠成一次状态标志位检查——循环 await 一亿次的耗时从 191ms 降到 32ms。Task.FromResult、ValueTask.CompletedTask 等直接被 JIT 折叠成快速路径;Task 和 ValueTask 之间的包装转换也能被拆包,某场景下生成代码从 115 字节缩到 29 字节。await Task.Yield() 去掉了线程池装箱分配:循环 1000 万次从 723ms 降到 534ms,追平了传统状态机模型。Preview 6 里 CoreCLR 跑在 WASM 上还只能"开机",Preview 7 已经可以端到端跑完整个运行时库测试套件了。背后是异常处理迁移到标准化的 exnref 提案、RyuJIT 点亮了大部分 PackedSimd 指令、新增 WASI 宿主等一连串工作。Blazor WebAssembly 用上 CoreCLR 的日子越来越近了。
PopCount / TrailingZeroCount 编译成单条 cnt/ctz 指令Activator.CreateInstance<T>() 的结果现在可以被去虚拟化,后续虚调用直接内联Vector<T> 不再被限制在 128 位float/double 到小整数类型的未检查转换现在正确饱和(以前 (short)32768.0 会得到 -32768……)dotnet new webapiaot 模板编译从 7.4s 降到 6.2sAssembly.GetCallingAssembly() 在 NativeAOT 下可用了(但需要堆栈跟踪数据)System.Numerics 新增 Decimal32、Decimal64、Decimal128,分别提供 7、16、34 位十进制精度。和 System.Decimal 不同,它们采用 IEEE BID 编码、支持无穷大和 NaN,并且完整接入泛型数学(IDecimalFloatingPointIeee754<TSelf>)。金融计算、科学计算多了新选择。
是的,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。
GZipCompressedContent、BrotliCompressedContent、ZstandardCompressedContent 三个 HttpContent 包装器,上行请求体也能压缩了。SocketsHttpHandler 新增实验性回调 ShouldEvictConnection:以前为了让 HttpClient 感知 DNS 变更,只能粗暴设置 PooledConnectionLifetime 定期回收所有连接;现在可以只在 DNS 真的变了的时候才踢掉旧连接,健康连接不再被误杀。Dns.ResolveSrv、ResolveMx、ResolveTxt、ResolveCName 等全新 API 上线,返回强类型记录。目前仅 Windows 实现(基于 DnsQueryEx),其他平台后续预览版补上。
开启 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% 的输入会得到和之前不同的(但正确的)结果这可能是你每天都能感知到的变化: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 工作进程,连续的 dotnet build / dotnet test 不用重复启动 MSBuild。老行为可通过 DOTNET_CLI_USE_MSBUILD_SERVER=false 恢复。
--timeout 90s 和 --maximum-failed-tests 5(跑挂 5 个就止损)Microsoft.Build.Traversal 项目跑测试--list-tests json 输出结构化测试清单,方便工具消费--list-devices 发现设备、--device 先部署再测试dotnet reference add --file app.cs MyLib/MyLib.csproj 可以直接往 .cs 文件里插入 #:project 指令,单文件应用引用项目不用再手敲了。
优先使用平台原生容器运行时——Windows 上用 wslc,macOS 上用 container,Docker 和 Podman 退居备选。
Interactive Server 模式下,当浏览器标签页被切到后台,电路可以自动暂停释放服务器资源,用户切回来再恢复。引入 Microsoft.AspNetCore.Components.Server.AutoPause 包:
app.MapRazorComponents<App>()
.AddInteractiveServerRenderMode()
.WithBrowserOptions(options =>
{
options.AddAutoPause(pause =>
{
pause.HiddenDelay = TimeSpan.FromSeconds(30); // 默认 2 分钟
});
});很贴心的是,如果用户正在输入、视频正在播放、或者有进行中的 JS 互操作,暂停会自动延后,不会丢数据。
新组件 CacheView 可以缓存服务端渲染子树的 HTML 输出,命中缓存时内部组件完全不实例化,直接回放 HTML:
<CacheView ExpiresAfter="TimeSpan.FromMinutes(10)"
VaryByRoute="productId"
VaryByQuery="page,pageSize"
VaryByCulture="true">
<ExpensiveProductSummary ProductId="productId" />
</CacheView>支持绝对/滑动过期、按路由/查询字符串/请求头/Cookie/用户/区域文化等多维度缓存键;注册了 HybridCache 还会自动升级为两级缓存。AuthorizeView、QuickGrid 这类依赖每请求状态的组件有内置标注,放错位置会给出明确的报错提示。
BL0012~BL0016 默认开启,专治各种常见坑:多余的 StateHasChanged() 调用、忘了订阅认证状态变更、for 循环变量被闭包捕获、非 public 的 [JSInvokable]、没包 try/catch 的 JS 互操作调用。
ValidatableTypeAttribute / SkipValidationAttribute 摘掉实验标签IStringLocalizerFactory 即自动生效,不再需要单独的 Localization 包itemSchema 描述 SSE(Server-Sent Events)流的事件结构ITlsConnectionFeature 读取 TLS 通道绑定令牌,防中继攻击QuickGrid 新增 InitialItemIndex 和 ScrollToItemAsync(虚拟化模式下)wasm-tools 升级到 Emscripten 6这一版 EF Core 的查询翻译改进相当亮眼,而且不少来自社区贡献:
int.Parse 等解析方法可翻译为 SQL Server CAST,不再被迫客户端求值g.Max(o => o.Customer.Region) 从"每组一次相关子查询"回归为单条 LEFT JOIN + GROUP BY,修掉了一个 EF Core 7 时代的性能回退GroupBy + 每组取 First 之后还能继续组合查询(以前直接报翻译失败)LEFT JOIN 无匹配行时,匿名类型/DTO 投影正确产出 null 而不是抛 Nullable object must have a valueUtf8JsonReader,彻底告别 Newtonsoft.Json,查询重试也纳入执行策略Half 类型;PMC 的 Add-Migration/Update-Database 支持 -NoBuild⚠️ 注意:Microsoft.Data.Sqlite 不再支持 netstandard2.0(也就是不再支持 .NET Framework),最低目标框架为 net10.0。
新的 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); // 登录
}基于源生成器 + MetadataUpdateHandler,不重建应用就能更新已实例化的页面,Debug 构建默认开启。
Shell 路由用上了 ASP.NET Core 风格的路径参数,支持必填、可选、默认值、约束和 catch-all:
Routing.RegisterRoute("product/{sku}", typeof(ProductDetailPage));
await Shell.Current.GoToAsync("//products/product/seed-tomato");{RelativeSource AncestorType=...} 绑定编译为 AOT 安全的 TypedBindingdotnet watch 热重载支持通过 USB/Wi-Fi 连接真机 iOS/tvOS 设备*.symbols,App Store Connect 崩溃报告自动符号化let 右侧现在可以直接写 let!/use!/do!(以前报 FS0750)StructLayout 尺寸修正<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 仓库发布说明。