.NET 11 Preview 6 的变化横跨语言、Web、跨平台 UI 和数据访问层:C# 开始补齐扩展索引器与内置联合类型支持,ASP.NET Core 加入异步验证、自动 CSRF 防护并默认采用 OpenAPI 3.2,.NET MAUI 将 CollectionView 扩展到 Windows,而 EF Core 则能够翻译 FULL OUTER JOIN。
这些功能并非彼此孤立。它们共同指向一个方向:减少应用代码中的样板逻辑,让类型系统和框架承担更多正确性检查。不过这是预览版本,适合验证兼容性和设计方向,不宜未经评估直接进入生产环境。
C#:让数据模型表达得更准确
扩展索引器延续了扩展成员的思路:开发者可以在无法修改原始类型时,为它补充自然的索引访问能力。这对第三方集合类型、领域对象适配器和只读数据视图尤其有用。
内置联合类型支持则更值得后端开发者关注。许多方法并不只有“成功或抛异常”两种结果,它们可能返回成功值、验证错误或资源不存在。过去通常需要自定义包装类型、继承层次或第三方联合类型库;语言和基础类型提供直接支持后,这类 API 可以表达得更清楚。
在预览 API 最终定型前,可以先用现有 C# 类型模拟并验证这种建模方式:
public abstract record CreateUserResult
{
public sealed record Created(Guid UserId) : CreateUserResult;
public sealed record Invalid(string Message) : CreateUserResult;
public sealed record DuplicateEmail(string Email) : CreateUserResult;
}
static CreateUserResult CreateUser(string email)
{
if (string.IsNullOrWhiteSpace(email))
return new CreateUserResult.Invalid("Email is required");
if (email.Equals("used@example.com", StringComparison.OrdinalIgnoreCase))
return new CreateUserResult.DuplicateEmail(email);
return new CreateUserResult.Created(Guid.NewGuid());
}
var result = CreateUser("used@example.com");
var message = result switch
{
CreateUserResult.Created created => $"Created: {created.UserId}",
CreateUserResult.Invalid invalid => $"Invalid: {invalid.Message}",
CreateUserResult.DuplicateEmail duplicate => $"Duplicate: {duplicate.Email}",
_ => throw new UnreachableException()
};
Console.WriteLine(message);
把这段代码放入新的控制台项目即可运行:
dotnet new console -n UnionModelDemo
cd UnionModelDemo
# 用上面的代码替换 Program.cs
dotnet run
这不是 Preview 6 内置联合类型的最终语法,而是一种可立即运行的建模实验。等语言设计稳定后,可以比较迁移前后的穷尽匹配、序列化和公共 API 兼容性。
ASP.NET Core:验证、安全与接口描述进一步下沉
异步验证解决的是常见但容易处理错误的问题:验证输入时,应用可能需要查询数据库、检查远程服务或执行其他异步 I/O。同步验证器强行等待异步操作,容易造成线程阻塞;把异步验证纳入框架管线后,验证流程可以更自然地遵循 async/await。
自动 CSRF 防护减少了忘记配置安全检查的风险,但不能把“自动”理解成“所有接口都无需审查”。基于 Cookie 的浏览器请求通常需要 CSRF 防护,而仅使用 Authorization 请求头的无状态 API 面临的威胁模型不同。升级时应重点测试表单提交、Cookie 身份验证、跨域请求以及前端框架发送令牌的方式。
OpenAPI 3.2 成为默认版本意味着生成文档、客户端代码和 API 网关配置的工具链也要同步验证。规范版本升级本身并不保证下游生成器已经兼容。
可以创建一个隔离项目检查本机 Preview SDK 及默认 OpenAPI 输出:
dotnet --list-sdks
dotnet new webapi -n Net11PreviewApi -f net11.0
cd Net11PreviewApi
dotnet run
运行后,使用终端打印应用暴露的 OpenAPI 文档。端口以 dotnet run 的实际输出为准:
curl -s http://localhost:5000/openapi/v1.json
若模板启用了 HTTPS,则改用控制台显示的 HTTPS 地址。检查文档顶部的 openapi 字段,并把生成结果送入现有客户端生成器、API 网关和契约测试,而不只是确认服务能够启动。
EF Core 与 MAUI:补齐真实项目中的缺口
EF Core 对 FULL OUTER JOIN 的翻译可以简化对账、数据同步和差异检测。典型场景是同时保留左表独有、右表独有以及双方匹配的记录。此前项目往往需要组合左右连接、使用原生 SQL,或者把部分数据拉回内存处理。
可以先用 SQL 明确期望语义,再对照 Preview 6 生成的 SQL:
SELECT
COALESCE(o.ExternalId, p.ExternalId) AS ExternalId,
o.Total AS OrderTotal,
p.Amount AS PaymentAmount
FROM Orders AS o
FULL OUTER JOIN Payments AS p
ON o.ExternalId = p.ExternalId
WHERE o.ExternalId IS NULL
OR p.ExternalId IS NULL
OR o.Total <> p.Amount;
迁移到 EF Core 翻译时,应通过 ToQueryString() 检查实际 SQL,并在目标数据库上验证执行计划。并非所有数据库都原生支持 FULL OUTER JOIN,提供程序是否支持翻译仍然是关键边界。
MAUI 将 CollectionView 扩展到 Windows,则减少了跨平台列表界面的条件分支。实际评估不能只看页面是否显示,还应覆盖虚拟化、滚动性能、选择状态、键盘操作、辅助功能和大数据集加载。
如何评估这次预览版
建议把 Preview 6 放进独立分支或小型验证项目,按以下顺序检查:
- 固定 Preview SDK 版本,避免 CI 和开发机自动漂移到不同构建。
- 为联合类型重点验证模式匹配、JSON 序列化和公共接口兼容性。
- 对异步验证进行取消、超时和并发测试,避免把网络调用无边界地放入请求管线。
- 用浏览器集成测试确认 CSRF 防护不会遗漏,也不会阻断合法请求。
- 将 OpenAPI 3.2 文档交给现有生成器和网关实际解析。
- 对 EF Core 查询检查生成 SQL、执行计划和数据库提供程序能力。
- 在 Windows 上对 MAUI CollectionView 运行性能与可访问性测试。
.NET 11 Preview 6 展示的重点不是单个语法糖,而是语言、框架和工具链共同承担更多基础工作。越早用真实业务中的小型场景验证这些能力,越容易在正式版本到来前发现兼容性问题,同时避免让预览依赖过早扩散到生产代码。