.NET 11 Preview 7 发布:一大波硬核更新来袭,离正式版又近了一步!

就在北京时间2026-08-12 凌晨,微软正式发布了 .NET 11 Preview 7。按照往年的节奏,这基本是新版本发布前最后一个大规模塞新特性的预览版了——接下来就是 RC,然后 11 月正式发布。

这一版的分量相当足:C# 终于迎来了带标签的 break/continuedotnet 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.FromResultValueTask.CompletedTask 等直接被 JIT 折叠成快速路径;TaskValueTask 之间的包装转换也能被拆包,某场景下生成代码从 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 新增 Decimal32Decimal64Decimal128,分别提供 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 请求压缩与智能连接淘汰

  • 新增 GZipCompressedContentBrotliCompressedContentZstandardCompressedContent 三个 HttpContent 包装器,上行请求体也能压缩了。
  • SocketsHttpHandler 新增实验性回调 ShouldEvictConnection:以前为了让 HttpClient 感知 DNS 变更,只能粗暴设置 PooledConnectionLifetime 定期回收所有连接;现在可以只在 DNS 真的变了的时候才踢掉旧连接,健康连接不再被误杀。

类型化 DNS 解析 API

Dns.ResolveSrvResolveMxResolveTxtResolveCName 等全新 API 上线,返回强类型记录。目前仅 Windows 实现(基于 DnsQueryEx),其他平台后续预览版补上。

System.Text.Json:封闭层级自动多态

开启 InferClosedTypePolymorphism 后,C# closed 类型层级不再需要手写 [JsonDerivedType],序列化器自动发现派生类型并分配判别符。

其他值得知道的

  • Complex<T> 泛型复数类型:可以用 floatHalfBFloat16 甚至新的 Decimal128 做复数运算
  • string.ToUpperOrdinal() / ToLowerOrdinal():与 OrdinalIgnoreCase 配套的区域性无关大小写转换,和"土耳其 i 问题"说再见
  • ChangeToken.OnChange 支持 Func<Task> 异步回调,配置文件热重载不再跑 async void
  • HybridCache 工厂回调可感知上下文:根据算出来的结果动态调整过期时间和本地缓存大小
  • 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 httpsdotnet ef 等工具调度命令:约 700ms → 200ms 左右(快 3 倍多)

原理是跳过了第二次 CoreCLR 启动。想退回老行为?DOTNET_CLI_ENABLEAOT=false 即可。目前 buildruntestpackpublish 等依赖 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 还会自动升级为两级缓存。AuthorizeViewQuickGrid 这类依赖每请求状态的组件有内置标注,放错位置会给出明确的报错提示。

五个新的 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 新增 InitialItemIndexScrollToItemAsync(虚拟化模式下)
  • wasm-tools 升级到 Emscripten 6

六、EF Core:查询翻译大丰收

这一版 EF Core 的查询翻译改进相当亮眼,而且不少来自社区贡献:

  • int.Parse 等解析方法可翻译为 SQL Server CAST,不再被迫客户端求值
  • 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 尺寸修正

九、上手方式

⚠️ 升级提醒:本版有一些破坏性变更,比较值得注意的包括——Preview 6 的 Virtualize API 改名(InitialIndexInitialItemIndex)、压缩选项里的 WindowLog 统一改名 WindowLog2EditContext.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 仓库发布说明。

posted @ 2026-08-12 17:35  张善友  阅读(243)  评论(5)    收藏  举报