.NET 11 Preview 5 发布
原文:.NET 11 Preview 5 is now available! – .NET Blog
发布日期:2026 年 6 月 10 日(美国当地时间)
今天,我们很高兴地宣布 .NET 11 的第五个预览版发布!此版本涵盖了 .NET Runtime、SDK、库、ASP.NET Core、.NET MAUI、C#、Entity Framework Core 等领域的改进。请查看下方的详细说明并立即开始使用。
Libraries(库)
System.Text.Json 支持 JSON Lines 序列化
System.Text.Json 现在可以通过新的 JsonSerializer.SerializeAsyncEnumerable 重载(topLevelValues: true)将 IAsyncEnumerable<T> 序列化为 JSON Lines 格式。相同的方法默认也会写入根级 JSON 数组,与现有的 DeserializeAsyncEnumerable 保持一致。JSON Lines 输出使用 \n 分隔值,忽略 WriteIndented 设置,每个项保持在一行上,适合日志流、消息馈送和批处理。
using System.Text;
using System.Text.Json;
static async IAsyncEnumerable<Reading> GetReadings()
{
yield return new("sensor-1", 21.5);
yield return new("sensor-2", 22.0);
}
await using var stream = new MemoryStream();
await JsonSerializer.SerializeAsyncEnumerable(
stream,
GetReadings(),
topLevelValues: true);
Console.WriteLine(Encoding.UTF8.GetString(stream.ToArray()));
// {"Id":"sensor-1","Value":21.5}
// {"Id":"sensor-2","Value":22}
public sealed record Reading(string Id, double Value);
这些重载同时支持 Stream 和 PipeWriter,可搭配 JsonSerializerOptions 或 JsonTypeInfo<TValue> 元数据使用。
LINQ 新增 Full Outer Joins(全外连接)
LINQ 现在为 Enumerable、Queryable 和 AsyncEnumerable 添加了 FullJoin 运算符。全外连接返回匹配对以及两个输入序列中的未匹配行。这使得内存查询拥有了开发者们在 SQL 中用于协调两个数据集时的同样能力。
using System.Linq;
Product[] catalog =
[
new("A100", "Keyboard"),
new("B200", "Mouse"),
];
Sale[] sales =
[
new("B200", 4),
new("C300", 2),
];
var rows = catalog.FullJoin(
sales,
product => product.Sku,
sale => sale.Sku,
(product, sale) => new
{
Sku = product?.Sku ?? sale!.Sku,
ProductName = product?.Name ?? "(not in catalog)",
QuantitySold = sale?.Quantity ?? 0,
});
foreach (var row in rows)
{
Console.WriteLine($"{row.Sku}: {row.ProductName}, sold {row.QuantitySold}");
}
public sealed record Product(string Sku, string Name);
public sealed record Sale(string Sku, int Quantity);
Preview 5 还为 Enumerable、Queryable 和 AsyncEnumerable 上的 Join、LeftJoin、RightJoin 和 GroupJoin 添加了返回元组的重载。
EqualityComparer 新增键选择器创建
EqualityComparer<T> 新增 By<TKey> 工厂方法,允许通过键选择器和可选的比较器创建相等比较器。
Random 新增泛型数值 API
Random 类新增了泛型 Next<T>() 方法,支持 byte、sbyte、short、ushort、int、uint、long、ulong、Half、float、double、decimal、Int128、UInt128、BigInteger 和 char 类型。
StringBuilder 支持无复制传输块
新的 DiscardChunk 和 TryGetChunk 方法允许 StringBuilder 在不复制数据的情况下传输内部块。
进程行读取和 KillOnParentExit 扩展
Process.Start 行读取新增 CancellationToken 重载以支持取消长时间运行的行读取操作。新的 KillOnParentExit 属性允许在父进程退出时自动终止子进程。
Reflection 暴露可为空基础类型
ConstructorInfo、EventInfo、FieldInfo、MethodInfo、ParameterInfo 和 PropertyInfo 新增了可为空基础类型的反射支持。
网络 API 新增视频 MIME 类型和 QUIC 流优先级
新增 video/mp4、video/webm 等视频 MIME 类型。QuicStream 新增了 Priority 属性用于设置流的优先级。
Cryptography 新增 X25519 密钥协商
新增 X25519 和 X25519+HKDF-SHA-256 密钥协商支持,基于 RFC 7748 和 RFC 9180 规范。
using System.Security.Cryptography;
var alice = X25519Agree.GenerateKey();
var bob = X25519Agree.GenerateKey();
byte[] aliceShared = alice.Agree(bob.PublicKey);
byte[] bobShared = bob.Agree(alice.PublicKey);
Console.WriteLine(aliceShared.SequenceEqual(bobShared)); // True
Syndication 支持裁剪和 Native AOT 馈送加载
SyndicationFeed 和 SyndicationItem 现在支持在修剪和 Native AOT 场景下加载 RSS/Atom 馈送。
Options 验证接受验证器类型
ValidateOptions 和 ValidateOptions<TOptions> 现在可以直接接受验证器类型,而不仅仅是实例。
⏱️ Runtime(运行时)
Runtime 异步挂起速度更快
Runtime 异步挂起和恢复在 Preview 5 中继续加速。最大的改进来自对使用 OSR(On-Stack Replacement,栈上替换)优化的异步方法——Runtime 异步现在直接将方法恢复到优化代码中,而不是走通用 OSR 转换路径。相关 PR 报告过渡开销约为 10-20 倍,挂起密集型基准测试从 6357.1 ms 改进到了 457.1 ms。
其他 Runtime 异步优化:
- 通用挂起路径使用更小的生成代码,挂起密集型微基准提升了约 8%,生成代码从 766 字节缩减到 751 字节。
- 挂起和恢复减少了线程本地存储工作,避免了热路径上的多个写屏障,从
350.3 ms改进到291.3 ms。 - Runtime 异步现在在
IValueTaskSource支持的ValueTask挂起时重用延续,消除了该路径上的分配。
JIT 优化
冗余 Span 和空值检查
JIT 现在能够从重复截取固定宽度前缀的 span 循环中移除更多范围检查。
int Sum(ReadOnlySpan<int> data)
{
Vector128<int> sum = default;
while (data.Length >= Vector128<int>.Count)
{
sum += Vector128.Create(data);
data = data.Slice(Vector128<int>.Count);
}
int result = Vector128.Sum(sum);
foreach (int t in data) result += t;
return result;
}
示例从 113 字节缩减到 79 字节。
边界检查消除改进
JIT 对 NegativeOne 常量有了更全面的理解,消除了 array.AsSpan()[..^1] 等模式的冗余检查。
常量折叠改进
JIT 的常量折叠阶段现在处理 uint 和 nuint 类型的常量。
Arm 内联函数新增原生整数和 SVE2 谓词
Arm64 内联函数对 int、uint、long 和 ulong 进位的相加/相减新增了原生整数支持。SVE2 谓词内联函数也得到了增强。
GC 修剪和压缩改进
GC 的压缩阶段在涉及到包含引用的对象时,使用更高效的扫描方式。
Browser/WebAssembly CoreCLR 启用
启用了在浏览器/WebAssembly 环境中运行 CoreCLR 的能力。
️ SDK
基于文件的应用可以引用其他 C# 文件
新的 #:ref 指令引用另一个基于文件的应用作为库,支持传递引用。
// app.cs
#:ref lib.cs
Console.WriteLine(MyLib.Greeter.Greet("World"));
// lib.cs
namespace MyLib;
public static class Greeter
{
public static string Greet(string name) => $"Hello, {name}!";
}
#:include 和 #:exclude 指令不再需要功能标志。
CLI 命令更一致地处理基于文件的应用
更多 SDK 命令现在理解基于文件的应用路径。
SDK 在构建期间提供漏洞和 EOL 检查
当检测到已知漏洞或 SDK 版本已达到 EOL 时,会生成警告。
dotnet new 包含 MCP Server 模板
dotnet new mcp-server
控制台应用默认包含 System.Net.Http.Json
容器发布验证 Bearer Token 领域
dotnet test 在 LLM 环境中禁用 ANSI 输出
NativeAOT CLI 快速路径已打包并可选加入
C#
封闭类层次结构(Closed Class Hierarchies)
closed 类只能在同一程序集中被直接继承。编译器在使用已知派生类型检查 switch 表达式的穷尽性时可以利用这一点。
public closed record class GateState;
public record class Closed : GateState;
public record class Open(float Percent) : GateState;
static string Describe(GateState state) => state switch
{
Closed => "closed",
Open(var percent) => $"{percent}% open"
};
封闭类规则:
closed类隐式为抽象类。- 直接子类型必须与封闭基类在同一程序集中声明。
- 当 switch 表达式处理了所有可达的直接子类型时,该 switch 表达式即为穷尽的。
联合声明和联合模式(Union Declarations and Union Patterns)
union 声明创建了一个值类型,其值可以是一组固定 case 类型之一。模式匹配可以解包联合值,当 switch 表达式处理了每种 case 类型时即为穷尽的。
public record class Dog(string Name);
public record class Cat(int Lives);
public union Pet(Dog, Cat);
static string Describe(Pet pet) => pet switch
{
Dog(var name) => $"dog: {name}",
Cat(var lives) => $"cat: {lives}"
};
Unsafe Evolution(不安全代码演进)
这是 .NET 11 的预览特性。
在 Preview 5 中,指针类型和指针值现在可以出现在 unsafe 上下文之外;unsafe 边界移到了解引用非托管内存的操作上。
int value = 42;
int* pointer = &value;
unsafe
{
System.Console.WriteLine(*pointer);
}
指针声明和取地址表达式允许在 unsafe 块外。指针解引用仍然需要 unsafe 上下文。
ASP.NET Core
Blazor SSR 支持客户端验证
Blazor SSR 表单现在获得即时、浏览器内的验证反馈,无需服务器往返。该功能默认对所有包含 DataAnnotationsValidator 组件的 SSR 表单启用。
Blazor 支持异步表单验证
新的 AsyncValidator 组件允许 Blazor 表单使用异步验证逻辑。
Blazor 和 Minimal APIs 支持本地化验证错误
验证错误消息现在可以通过 IStringLocalizer 进行本地化。
QuickGrid 无需交互性即可工作
QuickGrid 组件可以在 SSR 模式下通过表单回发处理排序和分页。
SupplyParameterFromSession 用于 Blazor
[SupplyParameterFromSession] 特性允许组件从 HttpContext.Session 获取参数值。
Blazor WebAssembly Gateway
WASM 应用可通过 ASP.NET Core 服务器网关请求资源,无需暴露 API 端点或处理 CORS。
跨渲染模式传递子内容
Kestrel 应用 Trailer Header 超时
OpenAPI 模式更好地匹配 ASP.NET Core 行为
.NET MAUI
可靠性和平台修复波次
Preview 5 带来了涵盖 CollectionView、CarouselView、Shell、手势、布局、RTL、SearchHandler、TabBar、Label、GraphicsView、SwipeView、HybridWebView、Entry、Editor、Picker、BoxView、ImageButton、RadioButton、AppThemeBinding 和导航生命周期的全面可靠性更新。
动画获得 CancellationToken 感知重载
await myLabel.FadeTo(0, 500).WaitAsync(cancellationToken);
BoxView 新增带 Brush 支持的 Fill 属性
Windows Maps 获得 Azure Maps 支持的实际实现
Material 3 处理器和帮助器变为公开
Android 最低 SDK 提升到 API 24
.NET for Android 稳定化 API 37
Apple Intelligence API 在 Essentials.AI 中发布
Entity Framework Core
dotnet ef 支持基于文件的应用
dotnet ef migrations add InitialCreate --file .\App.cs
dotnet ef 支持配置文件
dotnet ef 现在支持从 .config/dotnet-ef.json 文件加载默认选项。
EF1004:在同步运行异步 EF 查询时发出警告
// EF1004: 这可能会同步评估 EF 查询。
await foreach (var blog in blogsQuery.ToAsyncEnumerable()) { }
// 改用 EF Core 的异步查询管道
await foreach (var blog in blogsQuery.AsAsyncEnumerable()) { }
SQL Server 2022 兼容性成为默认
optionsBuilder.UseSqlServer(
connectionString,
sqlServerOptions => sqlServerOptions.UseCompatibilityLevel(150));
Temporal 周期属性可以映射到 CLR 属性
生成的 C# 使用文件范围命名空间
查询翻译生成更简洁的 SQL
破坏性变更
- 移除了 .NET 11 之前的过时 API
- Cosmos id 转义变更
开始使用
如果您在 Windows 上使用 Visual Studio,推荐安装最新的 Visual Studio 2026 Insiders。您也可以使用 Visual Studio Code 和 C# Dev Kit 扩展。
了解更多
- .NET 11 库的新特性
- .NET 11 运行时的新特性
- .NET 11 SDK 的新特性
- C# 15 的新特性
- ASP.NET Core 在 .NET 11 中的新特性
- .NET MAUI 在 .NET 11 中的新特性
- EF Core 11 的新特性
文章摘自:https://www.cnblogs.com/john0king/p/20412074
