C#语言特性及发展史

Posted louzi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#语言特性及发展史相关的知识,希望对你有一定的参考价值。

本文按照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();
  • 支持代码生成器

以上是关于C#语言特性及发展史的主要内容,如果未能解决你的问题,请参考以下文章

C#发展历程以及C#6.0新特性

C#发展历程以及C#6.0新特性

C#与C++的发展历程第一 - 由C#3.0起

C# 语言历史版本特性(C# 1.0到C# 8.0汇总)

C# 语言历史版本特性(C# 1.0到C# 8.0汇总)

JavaScript 夯实基础第一课:初学者必须要了解的 JavaScript 发展历程及语言规范特性