写在前面
本文是 .NET 新特性系列收官篇。.NET 10(2025-11)是当前最新的 LTS。C# 14 带来几个让人等了很久的特性:扩展成员(终于能扩展属性和静态成员)、field 关键字(访问自动属性的 backing field)、null 条件赋值。
运行时继续打磨,生产可用性进一步巩固。
一、版本概览
1
2
3
4
5
6
7
8
9
10
11
12
| .NET 10
发布:2025-11
支持:LTS(3 年)
C#:14
定位:当前最新 LTS
特点:
✓ 扩展成员(扩展属性/静态成员)
✓ field 关键字
✓ null 条件赋值
✓ 性能持续提升
✓ 新项目首选 LTS
|
二、C# 14 语言特性(重点)
2.1 扩展成员(extension members)⭐
等了很久的特性。以前只能写扩展方法,C# 14 终于能写扩展属性、扩展静态成员:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| // 以前(C# 3+):只能扩展方法
public static class StringExtensions
{
public static bool IsBlank(this string s) => string.IsNullOrWhiteSpace(s);
}
// C# 14:扩展属性(计算属性)
public static class StringExtensions
{
extension(string s)
{
public bool IsBlank => string.IsNullOrWhiteSpace(s); // 扩展属性
public string Reversed => new string(s.Reverse().ToArray());
}
}
"abc".IsBlank; // false(像属性一样用)
"abc".Reversed; // "cba"
// 还能扩展静态成员
extension(string)
{
public static string Empty2 => ""; // String.Empty2(静态)
}
|
1
2
3
4
5
| 意义:
C# 3 的扩展方法解决了"给现有类型加方法"
C# 14 终于补齐"加属性、加静态成员"
统一了扩展的语法
写流畅 API、DSL 更自然
|
2.2 field 关键字 ⭐
访问自动属性的 backing field(编译器生成的隐藏字段):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| // 以前:要么全用自动属性(无法加逻辑),要么手写字段
public class User
{
private string _name = "";
public string Name
{
get => _name;
set => _name = string.IsNullOrWhiteSpace(value) ? "" : value;
}
}
// C# 14:field 关键字,访问自动属性的 backing field
public class User
{
public string Name { get; set => field = string.IsNullOrWhiteSpace(value) ? "" : value; } = "";
// field 就是编译器生成的 backing field,无需手写 _name
}
// 还能在 get 里用
public int Discount
{
get => field > 0 ? field : 0;
set;
}
|
1
2
3
| field 解决:
自动属性要加一点逻辑时,不用退回手写字段
保持自动属性的简洁 + 按需加逻辑
|
2.3 null 条件赋值 ⭐
1
2
3
4
5
6
7
8
| // 以前:要先判断 null
if (user != null) user.Name = "new";
// C# 14:null 条件赋值
user?.Name = "new"; // user 非 null 才赋值
// 链式也行
config?.Database?.Timeout = 30; // 中间任意为 null 就跳过
|
2.4 其他
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| // user-defined compound assignment(自定义复合赋值)
// 配合 operator+ 等,自定义 += 行为
// partial events / partial constructors(配合源生成器)
public partial class X
{
public partial void OnLoad(); // partial 方法(已有)
public partial event EventHandler? Saved; // C# 14:partial 事件
}
// nameof unbound generic
string n = nameof(List<>); // "List"(不用指定类型参数)
// 隐式 Span/ReadOnlySpan 转换
void TakeSpan(ReadOnlySpan<int> s) { }
TakeSpan([1, 2, 3]); // 隐式转换更自然
// lambda 加 params
Func<int, int> f = params (int x) => x; // lambda 参数加 params(少见)
|
三、运行时与性能
1
2
3
4
5
6
7
8
9
10
| .NET 10 性能持续打磨:
✓ JIT 改进(更多优化、向量化)
✓ NativeAOT 改进(更小体积、更快、更多兼容)
✓ Server GC 进一步调优
✓ 异步、Span 持续优化
✓ JIT for loops 改进
亮点:
PGO 进一步增强(基于实际运行更精准)
AOT 生态扩大(更多库 AOT 友好)
|
四、BCL 改进
1
2
3
4
5
6
7
8
| // JsonSerializerOptions.Web(Web 场景默认选项)
var opts = JsonSerializerOptions.Web; // camelCase、宽松、适合 API
// 集合改进(Frozen、新增 API)
// Numerics / TensorPrimitives 增强(AI 方向持续)
// Source Generator 支持 JSON 序列化完善
// HttpClient、配置等改进
|
五、ASP.NET Core 10
1
2
3
4
5
| ✓ 性能改进
✓ Blazor 改进
✓ OpenAPI 原生生成完善
✓ AOT 支持扩大
✓ 身份认证、授权改进
|
六、升级建议
1
2
3
4
5
6
7
| .NET 10 是最新 LTS,新项目首选
从 8 升 10(同为 LTS):
✓ 扩展成员、field、null 条件赋值(生产力)
✓ 性能
✓ AOT 改进
兼容性好,升级风险低
|
七、小结
.NET 10 是当前最新 LTS:
- C# 14:扩展成员(属性/静态)、field 关键字、null 条件赋值、partial 事件、nameof 泛型、隐式 Span 转换
- 运行时:JIT/AOT/PGO 持续改进
- BCL:JsonSerializerOptions.Web、AI 数值方向
- ASP.NET Core:性能、Blazor、OpenAPI、AOT
- 定位:当前最新 LTS,新项目首选
系列总结
.NET 新特性六篇完结(5 → 10):
1
2
3
4
5
6
| .NET 5(C# 9) 统一开端 record、init、顶级语句、模式匹配
.NET 6(C# 10) 首个统一LTS 全局using、文件命名空间、record struct、Minimal API
.NET 7(C# 11) 表达力 原始字符串、列表模式、required、generic math
.NET 8(C# 12) 成熟LTS 主构造函数、集合表达式、NativeAOT、TimeProvider
.NET 9(C# 13) 精炼 params集合、Lock、HybridCache、TensorPrimitives
.NET 10(C# 14) 最新LTS 扩展成员、field、null条件赋值
|
选型建议:
- 新项目 / 生产 → 最新 LTS(.NET 10 或 8)
- 非 LTS(7/9)只用于尝鲜,不长期生产
- 升级收益看 LTS 版(6/8/10),ST 版(7/9)的语法特性只要项目支持就能用
演进脉络:
- 语言:减少样板、增强表达(record/init → 原始字符串 → 主构造 → 扩展成员)
- 运行时:性能 + AOT(分层编译 → PGO → NativeAOT)
- BCL:现代化(DateOnly → TimeProvider → HybridCache)
- 方向:AI/数值(TensorPrimitives)、云原生(AOT、容器)
掌握 5→10 的演进,既能在新项目用最新特性,也能理解老代码的写法。