.NET 10 的主线

微软把 .NET 10 定为 LTS(长期支持)版本,重点在三件事:极致性能、AI 集成、云原生体验。配合 C# 14 的语法改进,写 .NET 代码的舒适度又上了一个台阶。

一、C# 14:让样板代码消失

field 关键字:属性不用再写后备字段

public class Order
{
    public decimal Total { get; set; }

    // 以前需要 private decimal _discount;
    public decimal Discount
    {
        get => field;
        set
        {
            if (value is < 0 or > 1)
                throw new ArgumentOutOfRangeException(nameof(value));
            field = value;
        }
    }

    public decimal Payable => Total * (1 - Discount);
}

field 关键字让“半自动属性”终于不用手写后备字段了,这是 C# 社区呼声很高的改进。

扩展成员:扩展属性成为可能

public static class StringExtensions
{
    // 扩展属性(以往只能写扩展方法)
    extension(string s)
    {
        public bool IsBlank => string.IsNullOrWhiteSpace(s);
        public string Slug => s.Trim().ToLowerInvariant().Replace(" ", "-");
    }
}

// 使用
if (title.IsBlank) return;
var url = title.Slug;

空条件赋值与更简洁的 lambda

// 仅在非空时赋值
customer?.Orders ??= new List<Order>();

// 隐式 span 转换,减少手写 AsSpan
ReadOnlySpan<char> span = "hello";

二、性能:把 AOT 当成默认选项之一

# 发布原生 AOT 产物
dotnet publish -c Release -r linux-x64 /p:PublishAot=true

# 对比体积与启动时间
ls -lh bin/Release/net10.0/linux-x64/publish/app

AOT 编译后:

  • 启动时间从数百毫秒降到个位数毫秒;
  • 产物体积可到 10MB 级别(配合 TrimMode=full);
  • 内存占用显著下降,非常适合 Serverless 与 CLI。
<PropertyGroup>
  <PublishAot>true</PublishAot>
  <InvariantGlobalization>true</InvariantGlobalization>
  <TrimMode>full</TrimMode>
</PropertyGroup>

注意:AOT 下反射受限,序列化场景优先用 source generator:

// 编译期生成序列化代码,AOT 友好
[JsonSerializable(typeof(OrderDto))]
[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase)]
internal partial class AppJsonContext : JsonSerializerContext {}

var json = JsonSerializer.Serialize(order, AppJsonContext.Default.OrderDto);

三、Minimal API:十行代码一个服务

using Microsoft.Extensions.AI;

var builder = WebApplication.CreateBuilder(args);

// 内置 OpenTelemetry
builder.Services.AddOpenTelemetry()
    .WithMetrics(m => m.AddAspNetCoreInstrumentation())
    .WithTracing(t => t.AddAspNetCoreInstrumentation());

// 统一的 AI 抽象:换 OpenAI / Azure / Ollama 只改一行
builder.Services.AddChatClient(
    new OllamaChatClient(new Uri("http://localhost:11434"), "qwen2.5"));

var app = builder.Build();

app.MapGet("/health", () => Results.Ok(new { ok = true }));

app.MapPost("/summarize", async (ChatRequest req, IChatClient chat) =>
{
    var reply = await chat.GetResponseAsync($"用一句话总结:{req.Text}");
    return Results.Ok(new { summary = reply.Text });
});

app.Run();

record ChatRequest(string Text);

Microsoft.Extensions.AI 是 .NET 面向 AI 应用的统一抽象层,把“换模型厂商”从重写代码降级成换配置。

四、容器与可观测性

FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build
WORKDIR /src
COPY . .
RUN dotnet publish -c Release -o /app /p:PublishAot=true

FROM mcr.microsoft.com/dotnet/runtime-deps:10.0-alpine
WORKDIR /app
COPY --from=build /app .
USER $APP_UID
ENTRYPOINT ["./app"]

配合 SDK 内置的容器发布支持,甚至不需要写 Dockerfile:

dotnet publish -c Release /p:PublishProfile=DefaultContainer \
  /p:ContainerImageTag=1.0.0 /p:ContainerRuntime=docker

五、升级清单

  1. 把 global.json 与 CI 镜像切到 10.0,先跑一遍现有测试;
  2. 用 dotnet format 统一代码风格,顺手启用 C# 14;
  3. 对启动敏感的服务(函数计算、CLI)试点 AOT;
  4. 用 Microsoft.Extensions.AI 收敛散落各处的 SDK 调用。

小结

.NET 10 是一个“把复杂度收进框架”的版本:C# 14 消样板,AOT 管性能,Extensions.AI 统一 AI 接入。对于已经在使用 .NET 8/9 的团队,这是一次低风险、高回报的升级。