本文是从官方文档加以摘录和修改而来,在语言版本的节点加入了对应框架版本的主要特征,主要用作记录以备作者自己查阅。
本页介绍了 C# 语言每个主要版本的发展历史。 C# 团队将继续创新,以添加新功能。 可以在 GitHub 上的 dotnet/roslyn 存储库上找到详细的语言功能状态,包括考虑在即将发布的版本中添加的功能。
重要
为了提供一些功能,C# 语言依赖 C# 规范定义为标准库 所用的类型和方法。 .NET 平台通过许多包交付这些类型和方法。 例如,异常处理。 为了确保引发的对象派生自 Exception,将会检查每个 throw 语句或表达式。 同样,还会检查每个 catch,以确保捕获的类型派生自 Exception。 每个版本都可能会新增要求。 若要在旧版环境中使用最新语言功能,可能需要安装特定库。 每个特定版本的页面中记录了这些依赖项。 若要了解此依赖项的背景信息,可以详细了解语言与库的关系。
总览
下图是总结了 C# 语言从发布到现在的各个版本和相应的发布时间、框架版本、VS版本
注意:C# 7.1 版本开始增加了语言版本选择配置元素,可以开始直接控制 C# 版本,所以从这个版本开始,要求一栏展示的是默认版本
语言版本 | 发布时间 | 框架版本 | CLR 版本 | Visual Studio 版本 |
---|---|---|---|---|
C# 1.0 | 2002.2.13 | .NET Framework 1.0 | CLR 1.0 | Visual Studio 2002 / Visual Studio 7 |
C# 1.2 | 2003.4.24 | .NET Framework 1.1 | CLR 1.1 | Visual Studio 2003 |
C# 2.0 | 2005.11.7 | .NET Framework 2.0 | CLR 2.0 | Visual Studio 2005 |
C# 3.0-(不含Linq) | 2006.11.6 | .NET Framework 3.0 | CLR 2.0 | Visual Studio 2005 |
C# 3.0 | 2007.11.19 | .NET Framework 3.5 | CLR 2.0 | Visual Studio 2008 |
C# 4.0 | 2010.4.12 | .NET Framework 4.0 | CLR 4 | Visual Studio 2010 |
C# 5.0 | 2012.8.15 | .NET Framework 4.5 | CLR 4 | Visual Studio 2012 |
C# 5.0 | 2013.10.17 | .NET Framework 4.5.1 | CLR 4 | Visual Studio 2013 |
C# 5.0 | 2014.5.5 | .NET Framework 4.5.2 | CLR 4 | Visual Studio 2013 |
C# 6.0 | 2015.7.20 | .NET Framework 4.6 | CLR 4 | Visual Studio 2015 |
C# 6.0 | 2015.11.30 | .NET Framework 4.6.1 | CLR 4 | Visual Studio 2015 |
C# 6.0 | 2016.6.27 | .NET Core 1.0 | CoreCLR 1.0 | Visual Studio 2015 |
C# 7.0 | 2016.8.2 | .NET Framework 4.6.2 | CLR 4 | Visual Studio 2017 |
C# 7.0 | 2016.11.16 | .NET Core 1.1 | CoreCLR 1.1 | Visual Studio 2017 |
C# 7.1 | 2017.4.5 | .NET Framework 4.7 | CLR 4 | Visual Studio 2017 v15.3 |
C# 7.1 | 2017.8.14 | .NET Core 2.0 | CoreCLR 2.0 | Visual Studio 2017 v15.3 |
C# 7.2 | 2017.10.17 | .NET Framework 4.7.1 | CLR 4 | Visual Studio 2017 v15.5 |
C# 7.2 | 2018.5.30 | .NET Core 2.1 | CoreCLR 2.1 | Visual Studio 2017 v15.7 |
C# 7.3 | 2018.4.30 | .NET Framework 4.7.2 | CLR4 | Visual Studio 2017 v15.7 |
C# 7.3 | 2018.12.4 | .NET Core 2.2 | CoreCLR 2.2 | Visual Studio 2017 v15.7 |
C# 8.0 | 2019.4.18 | .NET Framework 4.8 | CLR 4 | Visual Studio 2019 |
C# 8.0 | 2019.9.23 | .NET Core 3.0 | CoreCLR 3.0 | Visual Studio 2019 |
C# 8.0 | 2019.12.3 | .NET Core 3.1 | CoreCLR 3.1 | Visual Studio 2019 v16.4 |
C# 9.0 | 2020.11.10 | .NET 5.0 | CoreCLR 5 | Visual Studio 2019 v16.8 |
C# 10.0 | 2021.11.8 | .NET 6.0 | CoreCLR 6 | Visual Studio 2022 |
C# 11 | / | .NET 7.0 | / |
版本详情
2002-2003:Framework 1.0 + C# 1.x
在 .NET 出现之前,编写 Windows 上可以运行的程序都是要直接和 COM(微软的一套软件的接口标准) 打交道。 .NET 框架试图通过 CLR 代替 COM,并提供更多功能,令用户可以更轻松的使用 Windows 的资源进行软件开发。
2002 年微软推出了 .NET Framework 1.0,相应的 Visual Studio 也升级到 7,称为 Visual Studio 2002(上一个版本叫做 Visual Studio 6)。该框架包含了 C# 和 VB.NET。同时,第一个版本的 ASP.NET 也在 .NET Framework 1.0 亮相,它作为网站的解决方案,一直是 .NET Framework 最重要的产品线之一。
C# 1.0
回想起来,和 Visual Studio .NET 2002 一起发布的 C# 版本 1.0 非常像 Java。 作为 ECMA 既定设计目标的一部分,其目标是成为一种 “简单、现代、通用的面向对象的语言”。当时,看起来像 Java 意味着它实现了早期的设计目标。
不过如果现在回顾 C# 1.0,你会觉得有点晕。 它没有习以为常的内置异步功能和以泛型为中心的巧妙功能。 其实它完全不具备泛型。 那 LINQ 呢? 尚不可用。 这些新增内容需要几年才能推出。
与现在的 C# 相比,C# 1.0 版少了很多功能。 你会发现自己的代码很冗长。 不过凡事总要有个开始。 在 Windows 平台上,C# 1.0 版是 Java 的一个可行的替代之选。
C# 1.0 的主要功能包括:
- 类
- 结构
- 接口
- 事件
- 属性
- 委托
- 运算符和表达式
- 语句
- 特性
C# 1.2
随 Visual Studio .NET 2003 一起提供的 C# 版本 1.2。 它对语言做了一些小改进。 最值得注意的是,从此版本开始,当 IEnumerator 实现 IDisposable 时,foreach 循环中生成的代码会在 IEnumerator 上调用 Dispose。
2005:Framework 2.0 + C# 2.0
2005年11月.NET Framework 2.0 发布。该框架包括了 C# 2.0,相比第一代添加了新的语法特征,其中最重要的就是泛型。
与此同时,CLR 的版本也相应的更新为 2.0,Visual Studio 也升级到 Visual Studio 2005。
.NET Framework 2.0 中,Web 应用解决方案仍然是 ASP.NET WebForm,WinForm 则作为 Windows 下的应用解决方案,数据库组件 ADO.NET 已经支持了 SQL Server 和 Oracle,Web Service的应用也多种多样,包括 .NET Remoting(TCP/HTTP/Pipeline communication)以及基础的Winsock等。
C# 2.0
从此以后事情变得有趣起来。 让我们看看 C# 2.0(2005 年发布)和 Visual Studio 2005 中的一些主要功能:
- 泛型
- 分部类型
- 匿名方法
- 可以为 null 的值类型
- 迭代器
- 协变和逆变
除现有功能以外的其他 C# 2.0 功能:
- getter/setter 单独可访问性
- 方法组转换(委托)
- 静态类
- 委托推断
C# 一开始是面向对象的 (OO) 通用语言,而 C# 2.0 版很快改变了这一点。 做好基础准备后,他们开始追求解决一些严重影响开发者的难点。 且他们以显著的方式追求这些难点。
通过泛型,类型和方法可以操作任意类型,同时保持类型安全性。 例如,通过 List<T>
,将获得 List<string>
或 List<int>
并且可以对这些字符串或整数执行类型安全操作,同时对其进行循环访问。 使用泛型优于创建派生自 ArrayList
的 ListInt
类型,也优于从每个操作的 Object
强制转换。
C# 2.0 版引入了迭代器。 简单来说,迭代器允许使用 foreach
循环来检查 List(或其他可枚举类型)
中的所有项。 拥有迭代器是该语言最重要的一部分,显著提升了语言的可读性以及人们推出代码的能力。
不过 C# 依然在追赶 Java 的道路上。当时 Java 已发布包含泛型和迭代器的版本。 但是随着语言各自的演化,形势很快发生了变化。
2006:Framework 3.0 + C# 3.0-(不含 Linq)
.NET Framework 3.0 是框架最重大的一次升级,包含了三大产品线:
- WCF 统一了过去 Web 服务混乱的形式,形成了一个统一标准。
- WPF 作为前端用户界面的解决方案,依靠 Siverlight 甚至入侵了 Web 领域。
- WF 提供工作流的管理。
.NET 3.0 标志着 Windows 平台开始全面转向 .NET 时代,在此之后的所有 Windows 都预装了 .NET ,在此之前,预装 .NET 的只有 Windows 的服务器版本。
当时的 .NET 只能在 Windows 上运行,通过 CLR 调用 Windows 的 API,从而控制电脑硬件。
.NET 3.0 的 CLR 和 .NET 2.0 的相同。
2007:Framework 3.5 + C# 3.0
.NET Franework 3.5 集成了包含 Linq 在内的完整 C# 3,Linq无疑是当前版本最重要的功能。相应的,为了Linq,此版本也加入了扩展方法、Lambda 表达式等新功能。从 C# 3 开始,C# 不再是 Java 的一个跟班小弟,某种意义上实现了对 Java 的超越(Java 直到 2014 年才在 Java 8 中加入了 Lambda 表达式)。
另外,.NET 3.5 SP1 新增了 ADO.NET Entity Framework 取代 ADO.NET,作为 ORM 的解决档案。在 ADO.NET Entity Framework 发表之前,NHibernate 是在 .NET Framework 经常使用的 ORM 实现,顾名思义,它是 Hibernate 在 .NET Framework 上的实现。相应的 Visual Studio 也升级到了 Visual Studio 2008。
C# 3.0
C# 3.0 版和 Visual Studio 2008 一起发布于 2007 年下半年,但完整的语言功能是在 .NET Framework 3.5 版中发布的。 此版本标示着 C# 发展过程中的重大更改。 C# 成为了真正强大的编程语言。 我们来看看此版本中的一些主要功能:
- 自动实现的属性
- 匿名类型
- 查询表达式
- Lambda 表达式
- 表达式树
- 扩展方法
- 隐式类型本地变量
- 分部方法
- 对象和集合初始值设定项
回顾过去,这些功能中大多数似乎都是不可或缺,难以分割的。 它们的组合都是经过巧妙布局。 我们认为 C# 版本的杀手锏是查询表达式,也就是语言集成查询 (LINQ)。
LINQ 的构造可以建立在更细微的视图检查表达式树、Lambda 表达式以及匿名类型的基础上。 不过无论如何 C# 3.0 都提出了革命性的概念。 C# 3.0 开始为 C# 转变为面向对象 / 函数式混合语言打下基础。
具体来说,你现在可以编写 SQL 样式的声明性查询对集合以及其他项目执行操作。 无需再编写 for
循环来计算整数列表的平均值,现在可改用简单的 list.Average()
方法。 组合使用查询表达式和扩展方法让各种数字变得智能多了。
人们需要一些时间来掌握和吸收这种概念,不过已经逐渐做到了。 现在又过了几年,代码变得更简洁,功能也更强大了。
2010:Framework 4.0 + C# 4.0
.NET 4.0 集成了 C# 4,主要增加了动态语言运行时(DLR)和任务并行库(TPL),它包括 PLINQ、任务等,优化了多线程的编程方式。CLR 由 2 直接升级到 4。相应地,Visual Studio 也升级到了 Visual Studio 2010。
C# 4.0
C# 版本 4.0 随 Visual Studio 2010 一起发布,很难达到版本 3.0 的创新水平。 在 3.0 版中,C# 已经完全从 Java 的阴影中脱颖而出,崭露头角。 很快成为一种简洁精炼的语言。
这一版本引入了一些有趣的新功能:
- 动态绑定
- 命名参数 / 可选参数
- 泛型协变和逆变
- 嵌入的互操作类型
嵌入式互操作类型缓解了为应用程序创建 COM 互操作程序集的部署难题。 泛型协变和逆变提供了更强的功能来使用泛型,但风格比较偏学术,应该最受框架和库创建者的喜爱。 命名参数和可选参数帮助消除了很多方法重载,让使用更方便。 但是这些功能都没有完全改变模式。
主要功能是引入 dynamic
关键字。 在 C# 4.0 版中引入 dynamic
关键字让用户可以替代编译时类型上的编译器。 通过使用 dynamic 关键字,可以创建和动态类型语言(例如 JavaScript)类似的构造。 可以创建 dynamic x = "a string"
再向它添加六,然后让运行时理清下一步操作。
动态绑定存在出错的可能性,不过同时也为你提供了强大的语言功能。
2011:Framework 4.5 + C# 5.0
.NET 4.5 和 C# 5一起发布,C# 5 基本上全部都是围绕 async/await 关键字的。
相应地,Visual Studio 也升级到了 Visual Studio 2012。
与此同时,各个 .NET 的主要产品线也没闲着,例如 ASP.NET MVC 作为 ASP.NET 的一组类库,从 2009 年发布开始一直稳定迭代,Web Service 也在不断进化,从基于 XML 的 WCF 发展到 RESTful 的 WebAPI。
在这个当下,
最上面的应用层,ASP.NET 茁壮成长,继续和 PHP/JSP 等技术分庭抗礼,用户有 WebForm 和 MVC 可供选择。在 JS 方面,选择了 JQuery 作为官方 JS。值得注意的是,MVC 中的 M 由 ADO.NET Entity Framework 负责。Windows 下的解决方案仍然是 WPF。
中间的服务和数据层中,Web 服务拥抱 RESTful ,数据库方面也是由 ADO.NET Entity Framework 唱主角。
最下面当然就是基础类库(BLC)。在 C# 5 中,增加了对异步编程的简化。
C# 5.0
C# 版本 5.0 随 Visual Studio 2012 一起发布,是该语言有针对性的一个版本。 对此版本中所做的几乎所有工作都归入另一个突破性语言概念:适用于异步编程的 async 和 await 模型。 下面是主要功能列表:
- 异步成员
- 调用方信息特性
另请参阅 - 代码工程:C# 5.0 中的调用方信息属性
调用方信息特性让你可以轻松检索上下文的信息,不需要采用大量样本反射代码。 这在诊断和日志记录任务中也很有用。
但是 async 和 await 才是此版本真正的主角。 C# 在 2012 年推出这些功能时,将异步引入语言作为最重要的组成部分,另现状大为改观。 如果你以前处理过冗长的运行操作以及实现回调的 Web,应该会爱上这项语言功能。
2016:.NET Core 1.0 + C# 6.0
.NET Core 是 .NET Framework 的新一代版本,也是另外一种实现方式,是微软开发的第一个跨平台的、开源的、模块化的应用程序开发框架。
.NET Core 并不算是 .NET Framework 的继承者,而更像是它的兄弟,所以现在他们各自有了不同的版本编号。
.NET Core 和 .NET Framework 共用一部分底层功能(例如一些 BCL),与.NET Framework 不同的是, .NET Core 采用组件化管理的方式,应用程序只要通过 nuget 获取需要的组件即可,而 .NET Framework 一上来就全部安装。
.NET Core 的应用层包括 UWP,用于开发 Windows 商店应用(部署到人和支持 Win10 的设备上,如XBox,智能眼镜等),和 ASP.NET Core ,用于开发网站应用(通常为微服务架构的 WebAPI )。
中间层则是 CoreFX,它是 .NET Core 的基础类库,其作用类似于 .NET Framework 的基础类库 BLC。
底层则是两种运行时,Core RT 和 Core CLR。Core RT 将 C# 或者 VB.NET 代码直接转换为机器码运行在宿主机上,在不同平台上会使用不同的技术,Windows平台上使用的是 .NET Native,macOS 和 Linux 上使用的是 LLILC。而 Core CLR 就是 .NET Framework CLR 的移植,它包括一个全新的 JIT 编译器——RyuJIT,根据微软的测试报告,它的性能比旧版本提升了约 25%。
由于 .NET Core 极佳的跨平台表现,越来越多的网络应用使用 ASP.NET Core 来编写。
.NET Core 1.0 中,包含了专属的跨平台版 ORM : Entity Framework Core 1.0,Entity Framework Core 1.0 已获得 Apache License v2 的许可 , 并且完全在 GitHub 上开源。虽然 Entity Framework Core 1.0 与 Entity Framework 的早期版本具有一些概念上的相似之处,但是毫无疑问这是一个全新的代码库,旨在提高效率,它强大、灵活且可扩展并将支持一系列新的关系型数据库和非关系型数据库。
C# 6.0
C# 在 3.0 版和 5.0 版对面向对象的语言添加了主要的新功能。 版本 6.0 随 Visual Studio 2015 一起发布,通过该版本,它不再推出主导性的杀手锏,而是发布了很多使得 C# 编程更有效率的小功能。 以下介绍了部分功能:
- 静态导入
- 异常筛选器
- 自动属性初始化表达式
- Expression bodied 成员
- Null 传播器
- 字符串内插
- nameof 运算符
其他新功能包括:
- 索引初始化表达式
- Catch/Finally 块中的 Await
- 仅限 getter 属性的默认值
这些功能每一个都很有趣。 但从整体来看,可以发现一个有趣的模式。 在此版本中,C# 消除语言样本,让代码更简洁且更具可读性。 所以对喜欢简洁代码的用户来说,此语言版本非常成功。
除了发布此版本,他们还做了另一件事,虽然这件事本身与传统的语言功能无关。 他们发布了 Roslyn 编译器即服务。 C# 编译器现在是用 C# 编写的,你可以使用编译器作为编程工作的一部分。
2016:.NET Core 1.1 + C# 7.0
对于微软来说,.NET Core 1.0 (以及早期开发时) 使用 project.json 来处理包管理与版本相依的问题,是因为很多任务具还没赶上 (例如微软主力的建置工具 MSBuild),再加上 project.json/xproj 架构并不兼容于以 MSBuild 为主的工具链 (Toolchain),若是要修改成兼容 project.json/xproj 架构的话可能会付出极大成本,因此在 .NET Core 1.0 RC2 发布不久,官方就宣布要将 project.json/xproj 系统移回到以 MSBuild 为主的 csproj,由于 .NET Core 移回了 MSBuild 架构,因此在 Visual Studio 2017 的 .NET Core 工具内,已恢复可直接于 IDE 的 GUI 接口中编修包参考的功能。
C# 7.0
C# 7.0 版已与 Visual Studio 2017 一起发布。 虽然该版本继承和发展了 C# 6.0,但不包含编译器即服务。 以下介绍了部分新增功能:
out 变量
元组和析构函数
模式匹配
本地函数
扩展的 expression bodied 成员
Ref 局部变量和返回结果
其他功能包括:弃元
二进制文本和数字分隔符
引发表达式
这些都为开发者提供了很棒的新功能,帮助编写比以往任何时候都简洁的代码。 重点是缩减了使用out
关键字的变量声明,并通过元组实现了多个返回值。
但 C# 的用途更加广泛了。 .NET Core 现在面向所有操作系统,着眼于云和可移植性。 语言设计者除了推出新功能外,也会在这些新功能方面付出时间和精力。
2017:.NET Core 2.0 + C# 7.1
.NET Core 2.0 与 Visual Studio 2017 15.3,ASP.NET Core 2.0 和 Entity Framework Core 2.0 一起于2017 年 8 月 14 日发布。在这一阶段,.NET Core 已经逐渐成熟,成长为一个轻量高效的新型 Web 框架。
跨平台方面,在 Linux 上的体验更加良好,对于Linux 各种发行版本有了更清晰的定位方式,预览了对 ARM32 架构的 Linux 和 Windows 平台进行了支持。
体验方面增加了更好的对国际化的支持。
C# 7.1
C# 已开始随 C# 7.1 发布单点发行 。 此版本增加了语言版本选择配置元素、三个新的语言功能和新的编译器行为。
此版本中新增的语言功能包括:
- Main 方法
- 应用程序的入口点可以含有 async 修饰符。
- 文本表达式
- 在可以推断目标类型的情况下,可在默认值表达式中使用默认文本表达式。
- 推断元组元素名称
- 在许多情况下,可通过元组初始化来推断元组元素的名称。
- 泛型类型参数的模式匹配
- 可以对类型为泛型类型参数的变量使用模式匹配表达式。
最后,编译器有 -refout 和 -refonly 两个选项,可用于控制引用程序集生成
2018:.NET Core 2.1 + C# 7.2
.NET Core 2.1对性能、运行时和工具做了进一步,配套的 ASP.NET Core 2.1 和 Entity Framework Core 2.1 也一并发布。
- 给命令行工具 dotnet cli 提升了扩展性,当前版本开始 dotnet cli 有了类似 npm 般丝滑的使用体验,可以将工具部署为NuGet软件包。
- 添加了了一种新的基元类型 Span
,该类型可以在没有分配的情况下对数据进行操作。 - 添加了许多其他新的API,专注于加密、压缩和Windows兼容性。
- Self-contained 发布,可以在程序包中内置运行环境。
- 支持了 Alpine Linux 和 ARM32 结构的芯片。
- Entity Framework Core 2.1 加入了延迟加载能力。
C# 7.2
C# 7.2 版添加了几个小型语言功能:
stackalloc
数组上的初始值设定项。- 对支持模式的任何类型使用
fixed
语句。 - 无需固定即可访问固定的字段。
- 重新分配
ref
本地变量。 - 声明
readonly struct
类型,以指示结构不可变且应作为 in 参数传递到其成员方法。 - 在实参上添加
in
修饰符,以指定形参通过引用传递,但不通过调用方法修改。 - 对方法返回项使用
ref readonly
修饰符,以指示方法通过引用返回其值,但不允许写入该对象。 - 声明
ref struct
类型,以指示结构类型直接访问托管的内存,且必须始终分配有堆栈。 - 使用其他泛型约束。
- 非尾随命名参数
- 命名的参数可后接位置参数。
- 数值文字中的前导下划线
- 数值文字现可在任何打印数字前放置前导下划线。
- 访问修饰符
- private protected 访问修饰符允许访问同一程序集中的派生类。
- 条件 ref 表达式
- 现在可以引用条件表达式 (?:) 的结果。
2018:.NET Core 2.2 + C# 7.3
.NET Core 2.2 主要有以下改进:
- 支持了分层编译
- 增加了对运行时时间的支持
- ADO.NET 中增加了对 Azure Active Directory 认证方式的支持
- 支持了在 Main 函数之前注入代码
- 支持了 ARM32 架构的 Windows 系统
C# 7.3
C# 7.3 版本有两个主要主题。 第一个主题提供使安全代码的性能与不安全代码的性能一样好的功能。 第二个主题提供对现有功能的增量改进。 此外,此版本中还添加了新的编译器选项。
以下新增功能支持使安全代码获得更好的性能的主题:
- 无需固定即可访问固定的字段。
- 可以重新分配 ref 本地变量。
- 可以使用 stackalloc 数组上的初始值设定项。
- 可以对支持模式的任何类型使用 fixed 语句。
- 可以使用更多泛型约束。
对现有功能进行了以下增强:
- 可以使用元组类型测试 == 和 !=。
- 可以在多个位置使用表达式变量。
- 可以将属性附加到自动实现的属性的支持字段。
- 由 in 区分的参数的方法解析得到了改进。
- 重载解析的多义情况现在变得更少。
新的编译器选项为:
- -publicsign,用于启用程序集的开放源代码软件 (OSS) 签名。
- -pathmap用于提供源目录的映射。
2019:.NET Core 3.0/3.1 + C# 8.0
.NET Core 3.0 :
- 增加了对于 Windows 桌面程序的支持,还是熟悉的 Winform 和 WPF
- 支持了使用 .NET Core 构建 COM 组件
- 添加了新的 Json 组件 System.Text.Json
- 当前版本开始,编译结果为单独的可执行文件,而不再需要使用 dotnet xxx.dll 命令来执行
- 支持了将运行环境和依赖组件全部打包的单文件发布模式
- 支持使用程序集修剪来减小发布程序的大小
.NET Core 3.1 :
- macOS appHost 模式支持
- WinForm 部分空间重构
- 支持在 Windows 平台创建托管 C++ 项目
C# 8.0
C# 8.0 版是专门面向 .NET C# Core 的第一个主要 C# 版本。 一些功能依赖于新的 CLR 功能,而其他功能依赖于仅在 .NET Core 中添加的库类型。 C# 8.0 向 C# 语言添加了以下功能和增强功能:
- Readonly 成员
- 默认接口方法
- 模式匹配增强功能:
- Switch 表达式
- 属性模式
- 元组模式
- 位置模式
- Using 声明
- 静态本地函数
- 可处置的 ref 结构
- 可为空引用类型
- 异步流
- 索引和范围
- Null 合并赋值
- 非托管构造类型
- 嵌套表达式中的 Stackalloc
- 内插逐字字符串的增强功能
默认接口成员需要 CLR 中的增强功能。 这些功能已添加到 .NET Core 3.0 的 CLR 中。 范围和索引以及异步流需要 .NET Core 3.0 库中的新类型。 在编译器中实现时,可为 null 的引用类型在批注库时更有用,因为它可以提供有关参数和返回值的 null 状态的语义信息。 这些批注将添加到 .NET Core 库中。
2020:.NET 5 + C# 9.0
当前版本是 .NET Core 和 .NET Framework 的大一统。
主要包含以下更新:
- System.Text.Json增加新功能
- 单文件应用程序更好支持
- 程序剪裁
- Windows ARM64 平台支持
- 支持使用工具转储调试
- 运行时库对无效的参考类型进行注释
- 在以下方面做了性能提升:
- 垃圾收集(GC)
- System.Text.Json
- System.Text.RegularExpressions
- Async ValueTask 池
- 容器尺寸优化
C# 9.0
C# 9 随 .NET 5 一起发布。 它是面向 .NET 5 版本的任何程序集的默认语言版本。 它包含以下新功能和增强功能:
- record 类型
- 仅限 Init 的资源库
- 顶级语句
- 模式匹配增强功能
- 性能和互操作性
- 本机大小的整数
- 函数指针
- 禁止发出 localsinit 标志
- 调整和完成功能
- 目标类型的 表达式
- 匿名函数
- 目标类型的条件表达式
- 协变返回类型
- 扩展 支持 foreach 循环
- Lambda 弃元参数
- 本地函数的属性
- 支持代码生成器
- 模块初始值设定项
- 分部方法的新功能
C# 9 继续以前版本中的三大主题:删除不必要的模式、将数据与算法分离,以及在更多位置提供更多模式。
顶级语句意味着主程序将更易于读取。 减少了不必要的模式:命名空间、Program
类和 static void Main()
都是不必要的。
records 的引入为遵循值语义的引用类型提供了简洁的语法,以实现相等性。 你将使用这些类型来定义通常定义最小行为的数据容器。 仅限 Init 的资源库在记录中提供了非破坏性修改功能(表达式)。 C# 9 还添加了协变返回类型,以便派生记录可以重写虚拟方法,并返回从基方法的返回类型派生的类型。
模式匹配功能以多种方式进行了扩展。 数值类型现在支持范围模式。 可以使用 and
、or
和 not
模式组合模式。 可以通过添加括号来阐明更复杂的模式。
另一组功能支持 C# 中的高性能计算:
nint
和nuint
类型对目标 CPU 上的本机大小整数类型进行建模。- 函数指针提供类似委托的功能,同时避免创建委托对象所需的分配。
localsinit
指令可以省略以保存指令。
另一组改进支持代码生成器添加功能的场景:
- 模块初始化表达式是程序集加载时运行时调用的方法。
- 分部方法支持新的可访问修饰符和非 void 返回类型。 在这些情况下,必须提供一个实现。
C# 9 添加了许多其他小功能,提高了开发人员的工作效率,包括编写和读取代码:
- 目标类型
new
表达式 static
匿名函数- 目标类型的条件表达式
- 扩展
GetEnumerator()
支持foreach
循环 - Lambda 表达式可以声明弃元参数
- 特性可应用于本地函数
C# 9 版本继续致力于让 C# 成为一种新式通用编程语言。 功能继续支持新式工作负载和应用程序类型。
2021:.NET 6 + C# 10.0
.NET 6 提供 .NET 统一计划的最终部分,该计划在 .NET 5 中启动。 .NET 6 在移动、桌面、IoT 和云应用之间统一了 SDK、基础库和运行时。 除了这方面的统一以外,.NET 6 生态系统还提供了以下功能:
- 简化开发:轻松入门。 C# 10 中的新语言功能可减少需要编写的代码量。 利用 Web 堆栈和最小 API 的投资,可以轻松地快速编写更小、更快速的微服务。
- 更佳的性能:.NET 6 是最快的完整堆栈 Web 框架,如果在云中运行,则会降低计算成本。
- 终极工作效率:.Net 6 和 Visual Studio 2022 提供热重载、新的 git 工具、智能代码编辑、可靠的诊断和测试工具以及更好的团队协作。
C# 10
C# 10 向 C# 语言添加了以下功能和增强功能:
- 记录结构
- 结构类型的改进
- 内插字符串处理程序
- 指令
- 文件范围的命名空间声明
- 扩展属性模式
- 对 Lambda 表达式的改进
- 可使用内插字符串
- 记录类型可密封
- 改进型明确赋值
- 在同一析构中可同时进行赋值和声明
- 可在方法上使用属性
- CallerArgumentExpression 属性
- 增强的 pragma
其他功能在预览模式下可用。 建议尝试使用这些功能并提供相关反馈。 它们可能会在最终发布之前发生更改。 为了使用这些功能,需要在项目中将 设置为 Preview。 阅读本文后面的关于泛型属性的信息。
.NET 6 支持 C# 10。 有关详细信息,请参阅 C# 语言版本控制。