.NET 新特性(六):.NET 10(C# 14)最新 LTS

写在前面

本文是 .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 的演进,既能在新项目用最新特性,也能理解老代码的写法。