1.0 2002 年 1 月 Visual Studio .NET 2002
目标是一个简单、现代、通用的面向对象语言,c#刚推出的时候,还没有现在常用的泛型、linq,c#早期和java代码格式非常像,在windows平台上,c#1.0是java的一个可行的替代之选
C# 1.0 的主要功能包括:
- 类
- 结构
- 接口
- 事件
- 属性
- 委托
- 运算符和表达式
- 语句
- 特性
1.2 2003 年 4 月 Visual Studio .NET 2003
添加了一个小改动 在foreach循环的时候会对 IEnumerator 的 IDisposable实现调用 Dispose
2.0 2005年11月 Visual Studio 2005
新加的功能:
- 泛型
- 分部类型
- 匿名方法
- 可以为 null 的值类型
- 迭代器
- 协变和逆变
还有其它的更新: - getter/setter 单独可访问性
- 方法组转换(委托)
- 静态类
- 委托推断
重点说明:
泛型:在c#2.0 开始支持了 泛型 (通过泛型,类型和方法可以操作任意类型,同时保持类型的安全性。如 List,获得List、List并且可以对这些字符串或整数执行类型安全操作,现时进行循环访问。在泛型出现之前,想达到相同的效果 需要派生自 ArrayList、ListInt类型,还需要进行操作Object强制转换,明显使用泛型更方便高效)
迭代器:迭代器允许使用foreach检查 可枚举类 如List的所有项。 迭代器可以提升语言的可读性
此时java已经发布了包含了泛型和迭代器的版本,c#在追赶java
元组返回内容在DOTNET异常处理的优化
将错误异常对象返回到元组参数,判断异常对象是否为null,
tps可以从900提升到3k
3.0 2007年 11月 Visual Studio 2008
新增的功能:
- 自动实现的属性
- 匿名类型
- 查询表达式
- Lambda 表达式
- 表达式树
- 扩展方法
- 隐式类型本地变量
- 分部方法
- 对象和集合初始值设定项
重点说明:
构造linq的时候可以通过 表达式数、Lambda表达式、匿名类型 实现。这些概念让c#不只是一种面向对象的语言,也可以进行函数式变成,成为了一种混合语言。如计算总合不需要使用for求和,可以通过List.Sum()方法。查询表达式和扩展方法让编程更方便了。
4.0 2010年4月 Visual Studio 2010
新增的功能;
- 动态绑定
- 命名参数/可选参数
- 泛型协变和逆变
- 嵌入的互操作类型
重点说明:
dynamic关键字可以创建和动态类型语言(如js)类似的构造,c#提供了强大的动态类型的语言功能。(个人不建议在dotnet大范围使用dynamic,会有类型相关出错的可能性)
泛型协变和遡变在框架和库的开发者使用的较多。
5.0 2012年8月 Visual Studio 2012
新增的功能:
- 异步成员
- 调用方信息特性
- 代码工程:C# 5.0 中的调用方信息属性
重点说明:
async await 是 这个版本的主角,在语言层面引入异步操作的关键字,异步代码非常简单实现
调用方信息特性让你可以轻松检索上下文的信息,不需要采用大量样本反射代码。 这在诊断和日志记录任务中也很有用。
6.0 2015年 7月 Visual Studio 2015
新增的功能
- 静态导入
- 异常筛选器
- 自动属性初始化表达式
- Expression bodied 成员
- Null 传播器
- 字符串内插
- nameof 运算符
其他新功能包括: - 索引初始化表达式
- Catch/Finally 块中的 Await
- 仅限 getter 属性的默认值
重点说明:
语言层面没有太大的功能添加,但是 c#编译器使用c#编写了。Roslyn 重要的特性就是Compiler as a Service 简单的讲,就是就是将编译器开放为一种可在代码中调用的服务,
7.0 2017年3月 Visual Studio 2017
新增功能:
- out 变量
- 元组和析构函数
- 模式匹配
- 本地函数
- 已扩展 expression bodied 成员
- ref 局部变量
- 引用返回
其他功能包括:
- 弃元
- 二进制文本和数字分隔符
- 引发表达式
重点说明:
重点是使代码变得更简洁,此时的dotnet在dotnetcore 的云平台和可移植性发力。
7.1 2017年8月 Visual Studio 2017
此版本中新增的语言功能包括:
- asyncMain 方法
- 应用程序的入口点可以含有 async 修饰符
- default 文本表达式
- 在可以推断目标类型的情况下,可在默认值表达式中使用默认文本表达式。 让代码简洁优雅
- 推断元组元素名称
- 在许多情况下,可通过元组初始化来推断元组元素的名称。
- 泛型类型参数的模式匹配
- 可以对类型为泛型类型参数的变量使用模式匹配表达式。
编译器有 -refout 和 -refonly 两个选项,可用于控制引用程序集生成
7.2 2017年11月 Visual Studio 2017
C# 7.2 版添加了几个小型语言功能:
- stackalloc
- 对支持模式的任何类型使用 fixed
- 无需固定即可访问固定的字段。
- 重新分配 ref
- 声明 readonly struct in
- 在实参上添加 in
- 对方法返回项使用 ref readonly
- 声明 ref struct
- 使用其他泛型约束。
- 非尾随命名参数
- 命名的参数可后接位置参数。
- 数值文字中的前导下划线
- 数值文字现可在任何打印数字前放置前导下划线。
- private protected 访问修饰符
- private protected
- 条件 ref
- 现在可以引用条件表达式 ?:的结果
7.3 2018年5月
C# 7.3 版本有两个主要主题。 第一个主题提供使安全代码的性能与不安全代码的性能一样好的功能。 第二个主题提供对现有功能的增量改进。 此外,此版本中还添加了新的编译器选项。
8.0 2019年9月
C# 8.0 版是专门面向 .NET C# Core 的第一个主要 C# 版本。 一些功能依赖于新的 CLR 功能,而其他功能依赖于仅在 .NET Core 中添加的库类型。
C# 8.0 向 C# 语言添加了以下功能和增强功能:
- Readonly 成员
- 默认接口方法
- 模式匹配增强功能
- switch 表达式
- 属性模式
- 元组模式
- 位置模式
- Using 声明
- 静态本地函数
- 可处置的 ref 结构
- 可为空引用类型
- 异步流
- 索引和范围
- Null 合并赋值
- 非托管构造类型
- 嵌套表达式中的 Stackalloc
- 内插逐字字符串的增强功能
9.0 2020年11月
C# 9 随 .NET 5 一起发布。 它是面向 .NET 5 版本的任何程序集的默认语言版本。 它包含以下新功能和增强功能:
- 记录
- 仅限 Init 的资源库
- 顶级语句
- 模式匹配增强功能
- 性能和互操作性
- 本机大小的整数
- 函数指针
- 禁止发出 localsinit 标志
- 调整和完成功能
- 目标类型的 new 表达式
- static 匿名函数
- 目标类型的条件表达式
- 协变返回类型
- 扩展 GetEnumerator 支持 foreach 循环
- Lambda 弃元参数
- 本地函数的属性
- 支持代码生成器
- 模块初始值设定项
- 分部方法的新功能
主要内容:
- 删除不必要的模式:顶级语句意味着主程序将更易于读取。 减少了不必要的模式:命名空间、Program 类和 static void Main() 都是不必要的。
- 将数据与算法分离:records 的引入为遵循值语义的引用类型提供了简洁的语法,以实现相等性。 你将使用这些类型来定义通常定义最小行为的数据容器。 仅限 Init 的资源库在记录中提供了非破坏性修改功能(with 表达式)。 C# 9 还添加了协变返回类型,以便派生记录可以重写虚拟方法,并返回从基方法的返回类型派生的类型。
- 更多位置提供更多模式:模式匹配功能以多种方式进行了扩展。 数值类型现在支持范围模式。 可以使用and、or 和not 模式组合模式。 可以通过添加括号来阐明更复杂的模式。
- 高性能计算相关(不安全的代码,个人不建议使用):
- nint 和 nuint 类型对目标cpu的本机大小整数类型进行建模
- 函数指针 提供类似委托功能,同时避免创建委托对象所需的分配
- localsinit 指令可以省略以保存指令
另一组改进支持代码生成器添加功能的场景
- 模块初始化表达式 是程序集加载时运行时调用的方法
- 分部方法 支持新的可访问修饰符和非 void 返回类型。 在这些情况下,必须提供一个实现。
小功能,提高了开发人员的工作效率,包括编写和读取代码:
- 目标类型 new 表达式
- static 匿名函数
- 目标类型的条件表达式
- 扩展 GetEnumerator() 支持 foreach 循环
- Lambda 表达式可以声明弃元参数
- 特性可应用于本地函数
C# 9 版本继续致力于让 C# 成为一种新式通用编程语言。 功能继续支持新式工作负载和应用程序类型。
10 2021年11月
C# 10 继续致力于删除不必要的模式、将数据与算法分离以及提高 .NET 运行时的性能等主题。
C# 10 向 C# 语言添加了以下功能和增强功能:
- 记录结构
- 结构类型的改进
- 内插字符串处理程序
- global using 指令
- 文件范围的命名空间声明
- 扩展属性模式
- 对 Lambda 表达式的改进
- 可使用 const 内插字符串
- 记录类型可密封 ToString()
- 改进型明确赋值
- 在同一析构中可同时进行赋值和声明
- 可在方法上使用 AsyncMethodBuilder 属性
- CallerArgumentExpression 属性
- 增强的 #line pragma
11 2023年11月
- C# 11 引入了泛型数学以及支持该目标的几个功能。 可以为所有数字类型编写一次数值算法。
- 简化 struct 类型处理,例如所需成员和自动默认结构
- 使用原始字符串文本、字符串内插中的换行符和 UTF-8 字符串文本可以更轻松地处理字符串。
- 文件本地类型等功能使源生成器更简单。
- 最后,列表模式添加了对模式匹配的更多支持。
C# 11 中增加了以下功能:
- 原始字符串字面量
- 泛型数学支持
- 泛型属性
- UTF-8 字符串字面量
- 字符串内插表达式中的换行符
- 列表模式
- 文件本地类型
- 必需的成员
- 自动默认结构
- 常量 string 上的模式匹配 Span
- 扩展的 nameof 范围
- 数值 IntPtr
- ref 字段和 scoped ref
- 改进了方法组向委托的转换
- 警告波 7
内容参考:
https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-version-history