.NET 新特性(五):.NET 9(C# 13)精炼优化

写在前面

本文是 .NET 新特性系列第五篇。.NET 9(2024-11)是非 LTS 版,重点是精炼和优化params 集合(性能)、新 Lock 类型、HybridCache(统一缓存抽象)、Server GC 动态调谐。

语言上 C# 13 是小步改进,但运行时和 AI/数值方向投入很大(TensorPrimitives 等)。


一、版本概览

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
.NET 9
  发布:2024-11
  支持:非 LTS(标准支持 18 个月)
  C#:13
  定位:精炼优化、AI/数值方向布局

  特点:
    ✓ params 集合、新 Lock 类型
    ✓ HybridCache(统一缓存抽象)
    ✓ Server GC 动态调谐
    ✓ TensorPrimitives(AI/数值)

二、C# 13 语言特性

2.1 params 集合 ⭐

params 不再限于数组,支持任意集合类型(ReadOnlySpan、IEnumerable、List 等):

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// 以前:params 只能是数组(隐式 params object[] / int[])
void Sum(params int[] nums) { }

// C# 13:params 支持任意集合类型
void Sum(params ReadOnlySpan<int> nums) { }   // 栈分配,零 GC!
void Log(params IEnumerable<string> msgs) { }
void Build(params List<int> ns) { }

Sum(1, 2, 3);   // 调用方式不变

// 关键收益:params + ReadOnlySpan = 零堆分配
// 高频变参方法(日志、拼接)受益

2.2 新 Lock 类型 ⭐

新的 System.Threading.Lock,比 lock(object) 更快更清晰:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
// 以前:lock 任意对象
private readonly object _lock = new();
lock (_lock) { /* 临界区 */ }

// C# 13:专用 Lock 类型
private readonly Lock _lock = new();
lock (_lock) { /* 临界区 */ }   // lock(Lock) 走更快的路径

// Lock 还有 EnterScope() 等更现代的 API
using (_lock.EnterScope()) { /* 临界区 */ }

2.3 其他

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
// \e 转义(ESC 字符,0x1B)
char esc = '\e';   // 以前要写 '' 或 (char)27

// ref struct 可作泛型类型参数(配合 allows ref struct 约束)
static T Process<T>(T t) where T : allows ref struct { }
Process<int>(1);             // OK
Process<Span<int>>(span);    // OK(ref struct 作泛型参数)

// method group 自然类型改进(重载解析更好)

// 部分属性(partial properties,配合源生成器)
public partial string Name { get; set; }

// 属性模式隐式(更简洁)
bool IsOrigin(Point p) => p is { X: 0 } && p is { Y: 0 };

三、运行时与性能

3.1 Server GC 动态调谐

1
2
3
4
5
6
.NET 8 的 Server GC 动态适应,.NET 9 进一步调谐:
  根据内存压力、工作负载自动调整
  Gen 0/1/2 阈值动态化
  容器内存限制感知更强

  效果:内存占用更稳定,长跑服务不易内存膨胀

3.2 性能改进

1
2
3
4
✓ JIT 改进(更多内联、常量折叠)
✓ AOT 改进(更多场景、更小体积)
✓ 异步改进
✓ 循环优化

四、BCL 改进(重头)

4.1 HybridCache(统一缓存抽象)⭐

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// 以前:IDistributedCache / IMemoryCache 各自一套,要自己组装
// .NET 9:HybridCache 统一抽象(L1 内存 + L2 分布式)

builder.Services.AddHybridCache(options => {
    options.DefaultEntryOptions = new() { LocalCacheExpiration = TimeSpan.FromMinutes(10) };
});

public class UserService(HybridCache cache)
{
    public async Task<User> GetAsync(int id) =>
        // 先查 L1 内存,miss 查 L2 分布式,再 miss 调工厂
        await cache.GetOrCreateAsync($"user:{id}", async ct => await LoadFromDb(id), ct);
}
1
2
3
4
5
HybridCache 解决:
  L1(内存)+ L2(Redis)自动协同
  防缓存击穿(stampede 保护)
  统一 API,不再手写多级缓存
  (preview,后续版本完善)

4.2 OrderedDictionary(泛型版)

1
2
3
4
5
// 泛型有序字典(保持插入顺序)
var od = new OrderedDictionary<string, int>();
od["a"] = 1;
od["b"] = 2;
// 遍历按插入顺序

4.3 TensorPrimitives / Numerics(AI 方向)

1
2
3
4
5
6
7
// 张量基础运算(为 AI/ML 优化)
using System.Numerics.Tensors;
TensorPrimitives.Add(span1, span2, resultSpan);   // 向量加
TensorPrimitives.Dot(a, b);                        // 点积

// 配合 generic math(INumber<T>),数值计算更通用
// .NET 9 加大 AI/数值投入,为 ML.NET、ONNX 提供基础

4.4 其他

1
2
3
4
// System.Text.Json:IndentCharacter/Size(缩进控制)、required 成员
// Span 系列改进(更多 API)
// TimeZoneInfo 改进
// SearchValues 增强

五、ASP.NET Core 9

1
2
3
4
✓ 静态资产优化(更好的静态资源交付、压缩、缓存)
✓ OpenAPI 原生生成(Microsoft.OpenApi,轻量)
✓ Blazor 改进(重新连接体验、静态 SSR)
✓ 路由改进(TypedResults 增强)

六、升级建议

1
2
3
4
5
6
7
.NET 9 非 LTS,生产建议用 8/10(LTS)
但值得体验:
  ✓ params ReadOnlySpan(高频方法零分配)
  ✓ Lock 类型
  ✓ HybridCache(preview)

从 8 升 9 风险低,可评估;生产建议等 10(LTS)

七、小结

.NET 9 是精炼优化的一版:

  • C# 13:params 集合(+ ReadOnlySpan 零分配)、新 Lock 类型、\e、ref struct 作泛型参数、partial 属性
  • 运行时:Server GC 动态调谐、JIT/AOT 改进
  • BCL:HybridCache(统一缓存)、OrderedDictionary 泛型、TensorPrimitives(AI 数值)、JSON 改进
  • ASP.NET Core:静态资产优化、原生 OpenAPI、Blazor
  • 定位:非 LTS,AI/数值方向布局,缓存统一

下一篇讲 .NET 10(C# 14):扩展成员、field 关键字——最新 LTS。