C# 版本号及特性历史

C# 版本号及特性历史

技术背景

C# 是一种现代的、面向对象的编程语言,由微软开发。随着时间的推移,C# 不断发展,每个版本都引入了新的特性和改进。了解 C# 的版本历史对于开发者来说至关重要,因为它可以帮助开发者利用最新的语言特性来提高开发效率和代码质量。

实现步骤

C# 各版本发布信息

以下是 C# 各版本的发布信息及主要特性:

C# 版本VS 版本.NET 版本CLR 版本发布日期主要特性
1.020021.01.0Feb 2002类、结构体、接口、事件、属性、委托、表达式、语句、属性、字面量
1.220031.11.1Apr 2003foreach 中的 Dispose、对字符串的 foreach 专门化
2.020052.02.0Nov 2005泛型、部分类型、匿名方法、迭代器、可空类型、getter/setter 单独可访问性、方法组转换(委托)、静态类、委托推断
3.020083.52.0Nov 2007隐式类型局部变量、对象和集合初始化器、自动实现属性、匿名类型、扩展方法、查询表达式、lambda 表达式、表达式树、部分方法
4.020104.04Apr 2010动态绑定、命名和可选参数、泛型委托和接口的协变和逆变、嵌入式互操作类型
5.020124.54Aug 2012异步方法、调用者信息属性
6.020154.64Jul 2015在线草案规范、编译器即服务(Roslyn)、导入静态类型成员到命名空间、异常过滤器、catch/finally 块中的 await、自动属性初始化器、只读属性默认值、表达式体成员、空传播器、字符串插值、nameof 运算符、字典初始化器
7.020174.74Mar 2017out 变量、模式匹配、元组、解构、丢弃、局部函数、二进制字面量、数字分隔符、ref 返回和局部变量、通用异步返回类型、更多表达式体成员、抛出表达式
7.12017 (v15.3)4.7.14Aug 2017异步主方法、默认表达式、引用程序集、推断元组元素名称、泛型模式匹配
7.22017 (v15.5)4.7.24Dec 2017Span 和 ref 类型、in 参数和只读引用、ref 条件、非尾随命名参数、私有受保护可访问性、基数说明符后的数字分隔符
7.32017 (v15.7)May 2018System.Enum、System.Delegate 和非托管约束、ref 局部变量重新赋值、stackalloc 初始化器、可移动固定缓冲区索引、自定义固定语句、改进的重载候选、初始化器和查询中的表达式变量、元组比较、支持属性支持字段的属性
8.020194.84Apr 2019可空引用类型、默认接口成员、递归模式、异步流、增强的 using、范围和索引、空合并赋值、静态局部函数、非托管泛型结构体、只读成员、嵌套上下文中的 stackalloc、替代插值逐字字符串、属性访问器上的 Obsolete、允许 t is null 对无约束类型参数
92019 (v16.8).NET 5Nov 2020仅 init 属性、记录、with 表达式、数据类、位置记录、顶级程序、改进的模式匹配、改进的目标类型、协变返回
102022.NET 6Nov 2021记录结构体、结构体无参数构造函数、插值字符串处理程序、全局 using 指令、文件作用域命名空间声明、扩展属性模式、常量插值字符串、解构中的混合赋值和声明、异步方法构建器、CallerArgumentExpression 属性、增强的 #line 编译指令
112022 (17.4).NET 7Nov 2022文件作用域类型、泛型数学支持、自动默认结构体、对常量字符串的 Span模式匹配、扩展的 nameof 作用域、数字 IntPtr、UTF - 8 字符串字面量、必需成员、ref 字段和 scoped ref、原始字符串字面量、改进的方法组转换为委托、警告波 7、泛型属性、字符串插值表达式中的换行符、列表模式
122022 (17.8).NET 8Nov 2023主构造函数、集合表达式、内联数组、lambda 表达式中的可选参数、ref readonly 参数、别名任何类型、Experimental 属性、拦截器
132022 (17.12).NET 9Nov 2024params 集合、新的 Lock 类型和语义、新的转义序列 \e、方法组自然类型改进、对象初始化器中的隐式索引器访问、迭代器和异步方法中的 ref 局部变量和不安全上下文、ref 结构体类型实现接口、部分属性和索引器、ref 结构体类型、重载解析优先级

版本独立性说明

C# 版本实际上与编译器绑定,而非 .NET 框架。例如,在 Visual Studio 2008 中可以编写 C# 3.0 代码并以 .NET Framework 2.0、3.0 和 3.5 为目标。Mono 2.0 (主要实现了 ECMA 规范中的 .NET Framework 2.0 版本)也支持 C# 3.0 语法和特性。

核心代码

以下是一些 C# 不同版本特性的简单代码示例:

C# 3.0 - 隐式类型局部变量

1
var number = 10;

C# 5.0 - 异步方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
using System;
using System.Threading.Tasks;

class Program
{
static async Task Main()
{
await PrintMessageAsync();
}

static async Task PrintMessageAsync()
{
await Task.Delay(1000);
Console.WriteLine("Hello, async world!");
}
}

C# 7.0 - 元组

1
2
var tuple = (1, "Hello");
Console.WriteLine($"Number: {tuple.Item1}, Message: {tuple.Item2}");

C# 8.0 - 可空引用类型

1
2
#nullable enable
string? nullableString = null;

最佳实践

  • 根据项目需求选择版本:如果项目需要兼容旧的 .NET 框架,可能需要选择较旧的 C# 版本。如果项目是全新的,建议使用最新的 C# 版本以利用最新的特性。
  • 逐步升级:如果要将现有项目升级到新的 C# 版本,建议逐步进行,确保每次升级后代码的正确性。
  • 关注官方文档:微软官方文档会详细介绍每个版本的新特性和使用方法,开发者应及时关注以跟上语言的发展。

常见问题

为什么没有 C# 3.5?

C# 版本号与 .NET 框架版本号是独立的。C# 3.0 存在于 .NET 3.5 中,这可能导致了混淆。

如何确定项目使用的 C# 版本?

可以通过项目的配置文件或 Visual Studio 中的项目属性来查看和设置 C# 版本。也可以参考 Microsoft 的参考文档 来了解不同 .NET 框架版本对应的默认 C# 版本。


C# 版本号及特性历史
https://119291.xyz/posts/2025-05-12.csharp-version-numbers-and-feature-history/
作者
ww
发布于
2025年5月12日
许可协议