写在前面
本文是 .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。