本文依照C#语言的倒退历史,介绍C#每个版本的新增个性,次要参考微软官网文档。理解这些语言个性能够帮忙咱们更高效的编写C#代码。
C# 1.0
与Visual Studio .NET 2002一起公布,该版本的C#十分像Java。
- 类
- 构造
- 接口
- 事件
- 属性
- 委托
- 运算符和表达式
- 语句
- 个性:无效地将元数据或申明信息与代码相关联,从而在运行时应用反射查问个性
C# 1.2
随Visual Studio .NET 2003一起公布,次要是一些小改良。值得注意的是,从此版本开始,当IEnumerator实现IDisposable时,foreach循环中生成的代码会在IEnumerator上调用Dispose。
C# 2.0
与Visual Studio 2005一起公布。自2.0开始,C#打好了根底,开始谋求解决一些重大影响开发者的难点。
- 泛型:应用泛型优于创立派生自ArrayList的ListInt或强制转换形式
- partial class
- 匿名办法:delegate运算符创立一个能够转换为委托类型的匿名办法。从C# 3.0开始,可应用lambda表达式创立匿名办法。
- 可空类型:可空类型
T?
示意其根底类型T的所有值及额定的null值。 - 迭代器:容许应用foreach来查看List(或其它可枚举类型)中的所有项
- 协变和逆变:实现数组类型、委托类型和泛型类型参数的隐式援用转换
C# 3.0
与Visual Studio 2008一起公布,但残缺性能是在.NET Framework 3.5版本中公布的。此版本标记着C#倒退过程中的重大更改。
- 主动实现的属性:C# 6及更高版本可像字段一样对其初始化
- 匿名类型
- 查问表达式
- lambda表达式
- 表达式树
- 扩大办法:无需创立派生类、从新编译或其它形式即可向现有类型增加办法
- var
- partial method:partial class的一部分定义签名,一部分定义实现
- 对象汇合初始化语法:new后应用{}进行初始化
C# 4.0
随Visual Studio 2010一起公布。
- 动静绑定:dynamic关键字
- 命名参数/可选参数:命名参数指定参数实参,不需匹配参数列表地位
- 泛型协变和逆变
- 嵌入互操作类型:CLR反对将COM类型信息间接嵌入到托管程序集中,不要求托管程序集从互操作程序集中获取COM类型的类型信息,弛缓了部署难点
C# 5.0
随Visual Studio 2012一起公布,次要工作是实用于异步编程的async和await模型。
- 异步成员:语言级别的异步编程模型,外围是Task和Task<T>对象,承受关键字async和await的反对
- 调用方信息个性
C# 6.0
随Visual Studio 2015一起公布。
- 动态导入:using static指令
- when:用于catch语句和switch语句
- 主动属性初始化表达式:属性的get/set拜访器可应用
=>
简化语法 - =>运算符
- Null流传器:仅当操作数的计算结果为非null时,null条件运算符才会将成员拜访
?.
或元素拜访?[]
运算利用于其操作数,否则返回null - 字符串内插:
$
特殊字符将字符串文本标识为内插字符串 - nameof运算符
C# 7.0
与Visual Studio 2017一起公布。
- out变量:能够在办法调用的参数列表中申明out变量,无需独自编写申明语句
- 元组和析构函数:能够创立蕴含多个公共字段的轻量级未命名类型
- 模式匹配:反对is表达式和switch表达式。is模式表达式可在一条指令调配后果:
input is int count
- 本地函数:实用于迭代器办法和异步办法,在办法外部申明办法
- 扩大expression bodied成员:可在属性、索引器、结构、析构、get/set拜访器应用
=>
- ref局部变量和返回后果
- throw表达式:throw可作为表达式而不是语句
C# 7.1 7.2 7.3
此版本开始C#能够单点发行,编译器有-refout
和-refonly
两个选项,可用于管制援用程序集生成。
- async Main办法:可在Main办法中应用await关键字
- default文本表达式
- 启用更高效的平安代码
- private protected拜访修饰符
- 条件ref表达式:条件表达式
?:
的援用而不是值 - 无需固定即可拜访固定的字段
- 能够重新分配ref本地变量
- 能够应用stackalloc数组上的初始值设定项
- 能够对反对模式的任何类型应用fixed语句
- 能够应用其余泛型束缚
C# 8.0
专门面向.NET Core的第一个次要C#版本。
- readonly成员:可将readonly修饰符用于struct成员
- 默认接口办法:可将成员增加到接口并提供实现
- 模式匹配加强性能:在更多地位应用,联合switch表达式(不是switch语句),可用于属性模式、元组模式、地位模式
- using申明:带using关键字的变量申明,批示编译器在关闭范畴的开端解决变量
- 动态本地函数
- 可处理的ref构造
- 可空援用类型
- 异步流:创立并以异步形式应用流
- 索引和范畴:为拜访序列中的单个或范畴元素提供了简洁语法。依赖两个新运算符:开端运算符
^
和范畴运算符..
- null合并赋值:仅当左操作数为null时,能力应用
??=
运算符将右操作数赋给左操作数 - 非托管构造类型
- 嵌套表达式中的stackalloc
- 内插逐字字符串的加强性能:
$
和@
程序可任意安顿
C# 9.0
.NET 5.0反对C# 9.0
- record类型:不可变的援用类型,应用值语义实现相等性
- 仅限init的资源库:可为属性和索引器创立init拜访器而非set拜访器,结构完变为只读
- 顶级语句:应用程序中只有一个文件可应用顶级语句
- 模式匹配加强性能:and/or/not,如
if (e is not null) ...
- 性能和互操作性
- 调整和实现性能:如在new表达式中省略类型:
private List<int> nums = new();
- 反对代码生成器