C# 12 集合表达式与主构造函数:语法糖还是生产力

Words: 956Read Time: 3 minLast edited: 2026-8-4

上手背景

年初把手头几个项目从 .NET 6 迁到了 .NET 8,顺手开始用 C# 12 的新语法。用了两个多月,有的特性已经离不开了,有的用了一次又默默改回去。这篇记一下真实感受,不抄官方文档。

集合表达式:最没争议的好

C# 12 允许用 [1, 2, 3] 这样的方括号语法初始化一切集合,数组、List、Span 通吃:
最爽的是写单元测试和造种子数据,满屏的 new[] { }new List<string> { } 全部瘦身。编译器会根据目标类型生成最优的代码,数组场景甚至没有中间分配。这个特性我找不到任何不用的理由,老代码能换的都换了。

主构造函数:爽,但要分场合

主构造函数允许把参数直接写在类声明上,整个类体内都能用:
五行样板代码没了,第一眼非常爽。但我在 DI 重度场景里用了一阵又改回来了,核心原因是可读性
  • 传统写法里 _repo 带下划线,一眼认出是字段;主构造参数就是普通参数名,方法里突然冒出个 repo,得滚回类声明才知道它是哪来的。
  • 参数是「捕获」进方法体的,到底哪些参数被用到了、哪些只是传给基类,不扫完全部方法看不出来。
  • 团队里有同事不熟这个语法,Code Review 时反复问「这个变量在哪定义的」,沟通成本比省下的五行代码贵。
我现在的取舍:小的值对象、DTO、record 风格的类用主构造;Controller、Service 这类 DI 入口类保留传统写法。语法糖再甜,也不能甜过团队共识。

required 成员:比构造函数参数更直白

required 修饰符要求属性在对象初始化时必须赋值,否则编译直接报错:
以前要表达「这几个字段必须有值」,要么写一堆构造函数参数(参数一多很难看),要么靠 [Required] 加运行时校验兜底。required 把这个约束提前到了编译期,配合对象初始化器还保持着可读性,定义接口入参模型时特别好用。

我的取舍

  • 集合表达式:全面拥抱,零副作用。
  • 主构造函数:小类用,DI 入口类不用,团队统一风格优先。
  • required 成员:API 入参模型标配,替代大部分 [Required] 场景。
  • 内联数组、ref readonly 参数这些,目前还没遇到非用不可的场景,继续观望。
C# 这两年的演进方向很明确:删样板代码。但语法糖的本质是把代码写短,不是把代码写明白,这两件事偶尔会冲突,主构造函数在 DI 场景里就是典型。
Loading...
© 2024 - 2026 ihuadz
中文