.NET 11 Preview 5 发布

.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 等领域的改进。请查看下方的详细说明并立即开始使用。

下载 .NET 11 Preview 5


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);

这些重载同时支持 StreamPipeWriter,可搭配 JsonSerializerOptionsJsonTypeInfo<TValue> 元数据使用。

LINQ 新增 Full Outer Joins(全外连接)

LINQ 现在为 EnumerableQueryableAsyncEnumerable 添加了 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 还为 EnumerableQueryableAsyncEnumerable 上的 JoinLeftJoinRightJoinGroupJoin 添加了返回元组的重载。

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 支持无复制传输块

新的 DiscardChunkTryGetChunk 方法允许 StringBuilder 在不复制数据的情况下传输内部块。

进程行读取和 KillOnParentExit 扩展

Process.Start 行读取新增 CancellationToken 重载以支持取消长时间运行的行读取操作。新的 KillOnParentExit 属性允许在父进程退出时自动终止子进程。

Reflection 暴露可为空基础类型

ConstructorInfoEventInfoFieldInfoMethodInfoParameterInfoPropertyInfo 新增了可为空基础类型的反射支持。

网络 API 新增视频 MIME 类型和 QUIC 流优先级

新增 video/mp4video/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 馈送加载

SyndicationFeedSyndicationItem 现在支持在修剪和 Native AOT 场景下加载 RSS/Atom 馈送。

Options 验证接受验证器类型

ValidateOptionsValidateOptions<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 的常量折叠阶段现在处理 uintnuint 类型的常量。

Arm 内联函数新增原生整数和 SVE2 谓词

Arm64 内联函数对 intuintlongulong 进位的相加/相减新增了原生整数支持。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 转义变更

开始使用

安装 .NET 11 SDK

如果您在 Windows 上使用 Visual Studio,推荐安装最新的 Visual Studio 2026 Insiders。您也可以使用 Visual Studio Code 和 C# Dev Kit 扩展。

了解更多

文章摘自:https://www.cnblogs.com/john0king/p/20412074