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模型。
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# 3.0新语言特性和改进(一)
引言 关于C#3.0的特性,园子里已经有了一大把,可能大家都很熟悉了,虽然本人开发中使用过,但自己还是需要记录一下,总结一下.同时也是后面写Linq知识的基础.希望有兴趣的朋友,可以看看. C# 3. ...
- 【转】浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- Pro ASP.NET MVC –第四章 语言特性精华
C#语言有很多特性,并不是所有的程序员都了解本书我们将会使用的C#语言特性.因此,在本章,我们将了解一下作为一个好的MVC程序员需要了解C#语言的特性. 每个特性我们都只是简要介绍.如果你想深入了解L ...
- 浅思OC的语言特性
算了算,学习IOS已经有一段时间了.今天花了点时间思考一下OC的语言特性,让自己的心不要那么浮躁,注重基础,回归本源. OC做为一门面向对象语言,自然具有面向对象的语言特性,如封装.继承.多态.他具有 ...
- XAML 名称范围 (x:) 语言特性
本节介绍为 Windows 运行时实现的 XAML 语言特性的参考信息. 本部分内容 主题 描述 x:Class 属性 配置 XAML 编译,在标记和代码隐藏之间连接分部类.代码分部类在一个独立的代码 ...
- C++ 语言特性的性能分析
转载:http://www.cnblogs.com/rollenholt/archive/2012/05/07/2487244.html 大多数开发人员通常都有这个观点,即汇编语言和 C 语 ...
- C# 动态语言特性,dynamic 关键字研究
1 动态语言简介 支持动态特性的语言现在大行其道,并且有继续增长的趋势.比如 Ruby 和 Python, 还有天王级的巨星 --- JavaScript. 现在一个程序员说自己对 Jav ...
- 理解Javascript的动态语言特性
原文:理解Javascript的动态语言特性 理解Javascript的动态语言特性 Javascript是一种解释性语言,而并非编译性,它不能编译成二进制文件. 理解动态执行与闭包的概念 动态执行: ...
- c#跟objective-c语言特性
c#跟objective-c语言特性的对比 拿c#语言跟objective-c做个对比,记录下自己认为是差不多的东西. 学过objc的人相信对category这个东西肯定不陌生,它可以让我们在没有源码 ...
随机推荐
- SOLID:面向对象设计的五个基本原则
在程序设计领域,SOLID 是由罗伯特·C·马丁在 21 世纪早期引入的记忆术首字母缩略字,指代了面向对象编程和面向对象设计的五个基本原则.当这些原则被一起应用时,它们使得一个程序员开发一个容易进行软 ...
- HDU-6874 Decision 倍增 (2020 HDU多校 D7 D)
Decision 题意 从 \([0,t]\) 中等概率的选取两个数字 \(v_1,v_2\), 定义序列 \(X\) 有 \(X_0=v1+v2,X_{n+1}=(aX_n+c) \mod m\). ...
- WIN7使用msg命令发送消息心得
昨天搞了一下午+一晚上,终于捣鼓出了一些奇奇怪怪的操作,成功发送了消息. 应实验要求,博主有幸在家里搞到了两台win7,其他的系统是不是这么操作就不太清楚了. 一开始实验指导书上是用net send发 ...
- Eclipse无法打开提示could not open jvm.cfg错误
先言:我的问题只是出在之前我的java_jdk原来安装在F:\Temp这里,但是我之后在整理文件的时候把这个文件夹改成了F:\java_jdk.所以导致了错误的出现 解决方法1: 因为我的只是目录名称 ...
- 洛谷 P5057 [CQOI2006]简单题 (树状数组,位运算)
题意:有一个长度为\(n\)的数组,进行\(m\)次操作,每次读入一个值\(t\),如果\(t=1\),则将区间\([l,r]\)的数字反转,若\(t=2\),则查询下标为\(i\)的值. 题解:树状 ...
- AtCoder Beginner Contest 177 D - Friends (并查集)
题意:有\(n\)个人,给你\(m\)对朋友关系,朋友的朋友也是朋友,现在你想要将他们拆散放到不同的集合中,且每个集合中的人没有任何一对朋友关系,问最少需要多少集合. 题解:首先用并查集将朋友关系维护 ...
- win10 远程桌面 ubuntu
一.获取本机ip 通过ip查询网址来查询本机外网地址 二.下载远程链接软件 下载向日葵,注册账号 三.远程链接 将连接端与被连接端分别绑定账号,输入相应ip地址,即可连接.
- ajax全局
$.ajaxSetup({ complete: function (xhr) { xhr.promise().done(function (json) { if (json.errorNo == &q ...
- LaTex公式在线转图片
Reference https://latex.codecogs.com/gif.latex?THE_FORMULAR 注: 请不要包含空格 或者 将整段url放到浏览器里, 会产生空格等字符的替换, ...
- php 安装 yii framework notice-error 的解决方案!
1 问题描述: 2 解决方案: error_reporting(0); //解决error_notice 的最简单最有效的方法在每一个php文件的头部都加上error_reporting(0); 3. ...