ASP.NET Core 10 在 Blazor、SignalR、最小 API(Minimal APIs)和 OpenAPI 3.1 等方面引入了多项改进。此次更新聚焦于性能提升、开发便捷性以及与现代 Web 标准的更好集成。
<QuickGrid ... RowClass="ApplyRowStyle">
...
</QuickGrid>
@code {
private string ApplyRowStyle({TYPE} rowItem) =>
rowItem.{PROPERTY} == {VALUE} ? "{CSS STYLE CLASS}" : null;
}
这为基于特定条件设置网格样式提供了更大的灵活性。
Blazor 脚本优化:以前,Blazor 脚本作为嵌入资源在 ASP.NET Core 共享框架中提供。在.NET 10 中,这些脚本现在作为静态 Web 资源提供,并带有自动压缩和指纹识别功能,从而改善了加载时间和缓存效率。
路由模板高亮显示:[Route]特性现在支持对路由模板进行语法高亮显示,使得在代码编辑器中可视化和管理端点结构变得更加容易。
ASP.NET Core 10 为 SignalR 带来了更新,不过具体细节将在未来的预览版中提供。
最小 API 持续发展,使得使用更少的依赖构建轻量级 Web 服务变得更加容易。更多的更新将在发布时进行记录。
ASP.NET Core 10 引入了对 OpenAPI 3.1 的支持,该版本与 2020–12 JSON 模式草案保持一致。此次更新使 API 文档更加准确且结构更好,但也引入了一些不兼容的变更。
builder.Services.AddOpenApi(options =>
{
options.OpenApiVersion = Microsoft.OpenApi.OpenApiSpecVersion.OpenApi3_0;
});
对于在构建时生成 OpenAPI 文档,可以使用 MSBuild 选项指定版本:
<OpenApiGenerateDocumentsOptions>--openapi-version OpenApi3_0</OpenApiGenerateDocumentsOptions>
options.AddSchemaTransformer((schema, context, cancellationToken) =>
{
if (context.JsonTypeInfo.Type == typeof(WeatherForecast))
{
schema.Example = new OpenApiObject
{
["date"] = new OpenApiString(DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")),
["temperatureC"] = new OpenApiInteger(0),
["temperatureF"] = new OpenApiInteger(32),
["summary"] = new OpenApiString("Bracing"),
};
}
return Task.CompletedTask;
});
之后(.NET 10 更新)
options.AddSchemaTransformer((schema, context, cancellationToken) =>
{
if (context.JsonTypeInfo.Type == typeof(WeatherForecast))
{
schema.Example = new JsonObject
{
["date"] = DateTime.Now.AddDays(1).ToString("yyyy-MM-dd"),
["temperatureC"] = 0,
["temperatureF"] = 32,
["summary"] = "Bracing",
};
}
return Task.CompletedTask;
});
这些变化会影响所有 OpenAPI 版本,即使显式指定了 OpenAPI 3.0 也是如此。
app.MapOpenApi("/openapi/{documentName}.yaml");
目前,仅在通过端点提供 OpenAPI 文档时才支持 YAML 格式。在未来的版本中有望实现构建时生成 YAML 文档。
[HttpGet(Name = "GetWeatherForecast")]
[ProducesResponseType<IEnumerable<WeatherForecast>>(StatusCodes.Status200OK,
Description = "The weather forecast for the next 5 days.")]
public IEnumerable<WeatherForecast> Get()
这一变化通过提供更详细的响应描述改进了 OpenAPI 文档。
身份验证和授权增强功能:身份验证和授权方面的更多改进将在 ASP.NET Core 10 的未来更新中详细介绍。
其他改进:对使用顶级语句的应用程序进行测试的更好支持。以前,C# 9 及更高版本中的顶级语句应用程序要求开发人员手动声明:
public partial class Program
这是必要的,以便测试项目可以引用 Program 类。在.NET 10 中,如果未显式声明,源生成器会自动生成 public partial class Program。如果开发人员手动添加了它,新的分析器会建议删除它以避免冗余。
.NET 10 中的.NET MAUI 专注于在.NET MAUI、适用于 Android 的.NET、适用于 iOS 的.NET 以及 macOS 方面进行质量改进。此次更新增强了稳定性、性能和开发人员体验,确保了一个更加完善和可靠的多平台开发框架。
对 API 36(Android 16)和 JDK 21 的支持:适用于 Android 的.NET 现在包括对 Android API 36(Android 16 “Baklava”)和 JDK 21 的支持,使该框架与最新的 Android 发展保持一致。 要针对 Android 16 预览 API:
推荐的最低支持 API 级别:默认的最低支持 Android API 已从 21(Lollipop)更新为 24(Nougat)。仍然支持 API 21,但建议更新到 API 24 以避免由 Java 默认接口方法引起的运行时问题。
对 Android 的 dotnet run 支持:以前,由于缺少指定目标设备或模拟器的参数,.NET for Android 项目不支持 dotnet run 命令。在.NET 10 中,现在可以使用 dotnet run 运行 Android 项目,并提供了新的选项:
// 在连接的物理 Android 设备上运行
dotnet run -p:AdbTarget=-d
// 在正在运行的 Android 模拟器上运行
dotnet run -p:AdbTarget=-e
// 在特定的 Android 设备或模拟器上运行
dotnet run -p:AdbTarget="-s emulator-5554"
AdbTarget 属性允许开发人员在运行应用程序时指定要使用的设备。
<PropertyGroup>
<AndroidEnableMarshalMethods>false</AndroidEnableMarshalMethods>
</PropertyGroup>
<ItemGroup>
<AndroidMavenLibrary Include="com.facebook.react:react-android"
Version="0.76.0"
ArtifactFilename="react-android-0.76.0-release.aar" />
</ItemGroup>
这在处理不遵循标准命名约定的库时提高了灵活性。
更快的设计时构建:为了加快 Visual Studio 设计时的构建速度,.NET 10 不再调用 aapt2。相反,直接解析.aar 文件和 Android 资源,在某些情况下将构建时间从超过 2 秒减少到 600 毫秒以下。
一般 Android 改进:适用于 Android 的.NET 现在可以使用 JDK 21 进行构建。通过移除依赖 System.Reflection.Emit 的路径,启动性能得到了提高。修复了 ApplicationAttribute.ManageSpaceActivity 以防止出现 InvalidCastException 错误。
更新的平台支持:.NET 10 现在支持最新的平台版本:
默认启用修剪警告:以前,由于基类库中的问题,修剪警告被抑制。现在这些警告在.NET 9 中已得到解决,在.NET 10 中默认启用。要禁用修剪警告,添加以下 MSBuild 属性:
<PropertyGroup>
<SuppressTrimAnalysisWarnings>true</SuppressTrimAnalysisWarnings>
</PropertyGroup>
<PropertyGroup>
<BundleOriginalResources>false</BundleOriginalResources>
</PropertyGroup>
这一变化简化了库的构建,并为开发人员提供了对资源处理方式的更多控制。
EF Core 10(EF10)在 LINQ 查询翻译方面引入了改进,并增强了 ExecuteUpdateAsync 方法,使数据库操作更加灵活和高效。此版本需要.NET 10 进行编译和运行,并且与较旧的.NET 版本或.NET Framework 不兼容。
EF Core 10 继续完善查询翻译,优化性能并扩展对常用 LINQ 操作的支持。
// Base setters - update the Views only
Expression<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>> setters =
s => s.SetProperty(b => b.Views, 8);
// Conditionally add SetProperty(b => b.Name, "foo") to setters, based on the value of nameChanged
if (nameChanged)
{
var blogParameter = Expression.Parameter(typeof(Blog), "b");
setters = Expression.Lambda<Func<SetPropertyCalls<Blog>, SetPropertyCalls<Blog>>>(
Expression.Call(
instance: setters.Body,
methodName: nameof(SetPropertyCalls<Blog>.SetProperty),
typeArguments: [typeof(string)],
arguments:
[
Expression.Lambda<Func<Blog, string>>(Expression.Property(blogParameter, nameof(Blog.Name)), blogParameter),
Expression.Constant("foo")
]),
setters.Parameters);
}
await context.Blogs.ExecuteUpdateAsync(setters);
之后(EF Core 10 — 使用标准 Lambda 表达式):在 EF Core 10 中,ExecuteUpdateAsync 现在支持常规的 Lambda 表达式,使得动态执行有条件的更新变得更加简单:
await context.Blogs.ExecuteUpdateAsync(s =>
{
s.SetProperty(b => b.Views, 8);
if (nameChanged)
{
s.SetProperty(b => b.Name, "foo");
}
});
这一改进消除了对复杂表达式树操作的需求,使得更新更容易编写和维护。
C# 14 引入了几个新的语言特性,专注于提高代码清晰度、减少样板代码并增强性能。关键更新包括对未绑定泛型类型的 nameof 运算符、Span
private string _msg;
public string Message
{
get => _msg;
set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}
之后(C# 14 — 使用 field):使用新的 field 关键字,编译器会自动生成后备字段:
public string Message
{
get;
set => field = value ?? throw new ArgumentNullException(nameof(value));
}
此特性减少了样板代码,同时保持了功能。但是,如果一个类已经包含一个名为 field 的成员,开发人员可以使用 @field 或 this.field 来避免冲突。
Span
nameof 中的未绑定泛型类型:在 C# 的以前版本中,nameof 运算符只能用于封闭的泛型类型(例如,nameof(List
Console.WriteLine(nameof(List<>)); // 输出: "List"
此特性在需要处理泛型类型名称的元编程场景中有所改进。
TryParse<int> parse = (string text, out int result) => int.TryParse(text, out result);
之后(C# 14 — 支持类型推断)
delegate bool TryParse<T>(string text, out T result);
TryParse<int> parse = (text, out result) => int.TryParse(text, out result);
这一变化减少了冗余并提高了 lambda 表达式的可读性。