C# 版本演进与本书基线
本教程共 100 篇 · 第 7 篇 · 更新于 2026-07-31 · 约 9 分钟阅读
7. C# 版本演进与本书基线
本节目标:了解 C# 一年一个版本的节奏,扫一眼 8–14 代的关键特性,明白本教程为什么锁定 C# 14 / .NET 10。
很多老资料还停留在 C# 5、C# 6。如果你照着那些写,会错过大量让代码变短变美的现代语法。这一章给你一张”版本地图”,并交代本教程的取舍,免得你在网上看到旧写法时糊涂。
一年一个版本的节奏
从 C# 8.0(2019)起,微软把发版节奏固定为每年 11 月一次,跟 .NET 大版本同步。语言特性越加越多,但目标始终一致:少写样板、更清楚表达意图、跑得更快。
Note早期 C# 版本号带小数点(如 7.3),后来改成整数代(8、9、10…)。本教程讲到的”现代 C#“,主要指 8 之后的版本。版本号跳变不是跳步,只是改了命名规则。
C# 版本和 .NET 版本怎么对应
C# 语言和 .NET 平台是绑定发布的,记住这张对应表,你看到任何一个版本号都能定位:
| C# 版本 | 对应 .NET | 备注 |
|---|---|---|
| C# 8 | .NET Core 3.0 / .NET Standard 2.1 | 可空引用类型登场 |
| C# 9 | .NET 5 | 顶级语句、record |
| C# 10 | .NET 6(LTS) | 文件范围命名空间、全局 using |
| C# 11 | .NET 7 | 原始字符串 |
| C# 12 | .NET 8(LTS) | 主构造器、集合表达式 |
| C# 13 | .NET 9 | params 集合 |
| C# 14 | .NET 10(LTS) | 扩展成员、field 关键字 |
偶数 .NET(6、8、10)是 LTS,奇数(5、7、9)是 STS。所以 C# 14 配套的是 LTS 版本的 .NET 10——又新又稳,这正是选它当基线的底气。
LTS 与 STS:支持周期不同
前面装环境时提过,这里从”学习”角度再点一句:
- LTS(长期支持):约三年更新与安全修复,企业部署首选,资料最多最全。
- STS(标准支持):约一年半,适合尝鲜新特性。
学基础就选 LTS 配套的语言版本(C# 14 / .NET 10),你查到的答案、社区讨论、报错解法都最密集,遇到问题最容易搜到。
C# 8.0(2019)关键特性
- 空合并赋值
??=:只在左侧为空时才赋值。 - using 声明:
using var fs = ...;离开作用域自动释放资源。 - switch 表达式:把
switch当表达式用,返回值更紧凑。 - 可空引用类型(Nullable Reference Types):在编译期提示”这里可能为空”,大幅减少空引用崩溃。
C# 9(2020)关键特性
- 顶级语句(top-level statements):就是本教程开头的写法,省掉 Main 外壳。
- 记录类型
record:为数据容器提供”值相等”语义。 - init 访问器:只能在初始化时赋值,之后只读。
- 模式匹配增强:关系模式、逻辑模式
and/or/not。
C# 10(2021)关键特性
- 文件范围命名空间
namespace X;:本教程默认风格。 - 隐式全局 using:免写常见
using指令。 - record struct、lambda 改进等。
Tip注意 C# 10 开始强调”去仪式感”:你写得越少,越接近业务逻辑。文件范围命名空间和全局 using 正是为此而生。
C# 11(2022)关键特性
- 原始字符串字面量
"""...""":多行、无转义噪音,写 JSON/SQL 极爽(第 13 章详讲)。 - 必需成员
required:实例化时强制填某些属性。 - 泛型数学、列表模式等。
C# 12(2023)关键特性
- 主构造器(primary constructor):在类/struct 声明处直接写参数。
- 集合表达式
[1, 2, 3]:统一初始化数组、List、Span(本教程示例大量使用)。 - 别名任意类型、内联数组等。
C# 13(2024)关键特性
- params 集合:
params不再局限于数组,可为任意集合。 - 新锁类型
System.Threading.Lock。 - 转义序列
\e(ESC 控制字符)等小幅增强。
C# 14(2026)关键特性 · 本教程基线
- 扩展成员(extension members):可定义扩展属性,不止方法。
- 空条件赋值
?.出现在赋值左侧:customer?.Order = GetOrder();。 field关键字:属性访问器内直接引用编译器生成的备份字段。nameof支持未绑定泛型:nameof(List<>)返回"List"。- Span 隐式转换、lambda 参数可加修饰符等性能向增强。
其中 field 关键字很实用,它让你在属性访问器里直接拿到”编译器帮你生成的那个私有备份字段”,不用自己再声明一个 _name:
class Person
{
public string Name
{
get => field;
set => field = value ?? throw new ArgumentNullException(nameof(Name));
}
}
以前你得手写 private string _name; 再在 get/set 里引用 _name;现在用 field 关键字,编译器替你管这个备份,代码更短也更不容易拼错字段名。这就是 C# 14 “少写样板”思路的延续。
Note
field是 C# 14 新增的上下文关键字(contextual keyword):只有在属性访问器里它才表示备份字段,平时你仍可用field当普通变量名。本教程在对应章节会再见到它。
为什么以 C# 14 / .NET 10 为基线
三个理由:
- 最新且稳定:.NET 10 是 LTS(长期支持),C# 14 是其配套语言,学完能管很多年。
- 资料最干净:网上的老教程常停留在 C# 9 甚至更早,照搬会写出过时写法。以 14 为准,避免你学到”半截现代 C#”。
- 新语法更省力:集合表达式、原始字符串、顶级语句这些,正是让初学者少踩坑的设计。
Note本教程里凡是涉及 C# 12–14 的新语法(如集合表达式、
required),会在对应章节优先展示,旧写法只在”版本对比”里提一句,绝不让你混用。
一个跨版本的例子
同样是”建一个有 3 个元素的整数数组”,不同版本写法不同:
// 老写法(仍可用,但啰嗦)
int[] oldWay = new int[] { 1, 2, 3 };
// C# 12 集合表达式(本教程采用)
int[] numbers = [1, 2, 3];
第二行更短,且 [] 还能用于 List<int>、Span<int> 等。这就是”新基线”带来的好处。
老代码还看得懂吗
你可能会担心:学了新的 C# 14,公司里一堆 C# 8 的老代码是不是看不懂?放心,新版本完全向后兼容。C# 8 的写法在 C# 14 里照样能编译运行。新特性是”加法”,不是”替换”。
所以你学新语法,是多了工具,不是废了旧知识。反过来,你也可能被要求写兼容旧框架的代码——那时只要不碰新特性即可。本教程以 14 为基线展示新写法,但遇到旧项目,你会知道”降级”到哪种写法。
Note向后兼容也有极少数”破坏性变更”(breaking changes),但都在官方文档明确列出,且频率极低。日常学习不必焦虑,真碰到了查文档即可。
怎么知道我写的是哪个语言版本
两个办法确认:
- 看 SDK:装了 .NET 10 SDK,
dotnet --version显示 10.x,语言版本默认就是 14。 - 看项目文件:
.csproj里若写了<LangVersion>12</LangVersion>,就会被锁到 12。本教程默认不写,自动跟 SDK 走。
如果你照着教程写集合表达式 [1,2,3] 却报错说”不支持”,八成是语言版本被锁低了。检查 .csproj 里有没有 <LangVersion>,确认 SDK 是 10 即可。
Tip团队用的 .NET 版本较旧时,常会手动锁低
LangVersion以保证所有人一致。这不是你写错,是项目约束。知道这条,遇到”新语法在本机报错”就能先往版本上想。
常见疑问解答
问:C# 版本号为什么跳着涨? 早期有过 7.0、7.1、7.2 这种小版本,后来统一成整数代(8、9、10…)跟 .NET 主版本对齐。所以你看到 7.3 直接到 8.0 是正常的版本节奏变化。
问:旧教程里的写法还能用吗?
能。新版本向后兼容,老写法照样跑。只是本教程优先教你”现代更省的写法”,比如用集合表达式而非老式 new int[]{...}。两种你都该能看懂。
问:我要不要现在去追最新特性? 先把基础打牢。新特性是工具箱里的升级款,不是入门门槛。本教程在对应章节自然引入,你边学边用即可,不必单独啃特性清单。
问:LTS 和 STS 我该关心吗? 学基础阶段不必纠结,认准 LTS(.NET 10)就稳。等你进团队做长期项目,会理解”为什么公司偏爱 LTS”——支持久、升级压力小。
要点速记
- C# 每年 11 月随 .NET 发一版,节奏固定;偶数 .NET 是 LTS。
- C# 14 配 .NET 10(LTS),又新又稳,作基线最划算。
- 8–14 代主线:去样板、强表达、提性能。
field关键字(C# 14)让属性访问器直取备份字段。- 新语法优先展示,旧写法仅作版本对比;老代码完全向后兼容。
动手练一练
- 用自己的话列出 C# 9、10、11、12 各自最打动你的一个新特性,并说明”它省掉了什么麻烦”。
- 把旧写法
int[] a = new int[] { 1, 2, 3 };改写成 C# 12 的集合表达式,体会变短了多少。 - 打开
dotnet --version,确认你本地 SDK 是 10.x,和本教程基线对齐;再看看项目.csproj里有没有被锁低LangVersion。
小结与下一步
C# 一年一代,8 之后重点是”少写、写清、跑快”。本教程锁死 C# 14 / .NET 10(LTS),是让你学到最新、最稳、最省心的写法,也顺便给你一张版本地图,以后在网上看见旧语法能一眼认出”这是哪代的”。
接下来进入真正的语法地基:变量与常量。