C# 版本特性一览
前言
使用 C# 作为开发语言已经 15 个年头了,受惠于 C# 的不断更新,伴随着大量的新特性与大量语法糖,让我更加容易写出简洁、高效的代码。日常中大量特性早已信手拈来,当然从未尝试过的特性更是难以尽数,但是每每回忆代码中的特性究竟是哪个版本引入的,却颇为含糊。索性简单整理记录下来,用以备忘,进而能够更精确地根据想使用的特性确定程序需要的 Framework 版本。
尽管参考了微软的官方文档,但所列特性难免基于我所接触使用到的狭隘范围,用中括号附上短评(如【我是短评】),用以提示,希望不至于画蛇添足吧。
版本一览
C# 1.0
发布日期:2002 年 1 月
一切的开始,由于我是从 2.0 开始接触 C# 的,在此不赘述该版本了,只能说 C# 的起点不低,从 Java 转过来上手很快,兼具 C 语族的语法特点,同时又很有 Delphi 味,简直梦幻开局。
C# 1.2
发布日期:2003 年 4 月
从此版本开始,当 IEnumerator 实现 IDisposable 时,foreach 循环中生成的代码会在 IEnumerator 上调用 Dispose。【刚刚知道还有这特性】
C# 2.0
发布日期:2005 年 11 月
和 Visual Studio 2005 一起发布。看看这些金光闪闪的特性吧:
- 泛型
- 分部类型【
partial关键字】 - 匿名方法【利用
delegate运算符】 - 可为空的值类型【
Nullable<T>或T?】 - 迭代器【
yield return语句】 - 协变和逆变【这时候还不支持泛型接口和委托】
getter/setter单独可访问性- 静态类
C# 3.0
发布日期:2007 年 11 月
C# 3.0 和 Visual Studio 2008 一起发布于 2007 年下半年,但完整的语言功能是在 .NET Framework 3.5 版中发布的。如果说 2.0 时期是分庭抗礼,那么到了 3.0 就真的是一骑绝尘,诸多特性完美地结合在一起。尽管我习惯用 Lambda 表达式与链式调用来写 LINQ ,但是查询表达式写法的 LINQ 实在是太惊艳了。
- 自动实现的属性【
{ get; set; }写法】 - 匿名类型【
new { Foo = 108, Bar = "Hello" }写法】 - 查询表达式【
from foo select bar where baz写法】 - Lambda 表达式
- 表达式树
- 扩展方法
- 隐式类型本地变量【
var关键字】 - 分部方法【
partial关键字可以作用在方法上,没用过该特性】 - 对象和集合初始值设定项【
Foo foo = new Foo { Bar = "Hello" }写法】 - WPF、WCF、WF
C# 4.0
发布日期:2010 年 4 月
C# 版本 4.0 随 Visual Studio 2010 一起发布,引入了一些小改进。
- 动态绑定【
dynamic关键字,不在编译时检查类型,而是在运行时评估。】 - 命名实参和可选实参【可以少些一些方法重载了】
- 泛型协变和逆变【完全体,但一般只有底层类库设计者需要考虑这玩意】
- 嵌入的互操作类型【没什么存在感】
System.Threading.Tasks命名空间【更方便的线程操作及并行处理】System.Tuple类- 现有类的新方法【例如
String.IsNullOrWhiteSpace、Stopwatch.Restart、StringBuilder.Clear等等】 - 现有方法的新重载【例如
String.Join方法添加了可以连接IEnumerable<T>集合的成员的新重载。】 - Managed Extensibility Framework (MEF)【动态加载,实现插件系统的好帮手】
- ASP.NET MVC
C# 5.0
发布日期:2012 年 8 月
C# 版本 5.0 随 Visual Studio 2012 一起发布。.NET Framework 4.5、4.5.1、4.5.2 基本上就是一系列更新和优化,新东西很少。
- 异步成员【
async和await,版本之子。】 - 调用方信息特性【
CallerMemberName等,方便确定调用方信息。】
C# 6.0
发布日期:2015 年 7 月
版本 6.0 随 Visual Studio 2015 一起发布,发布了很多使得 C# 编程更有效率的小功能。对应 .NET Framework 4.6、4.6.1、4.6.2。.NET Core 出现了,好消息是 .NET 开放源码了,坏消息是微软开始折腾,从这开始语法糖多得齁嗓子。得益于诸多新特性,代码变得简短了,但是引入了很多新符号,心智负担加重了。“Null 条件运算符”、“字符串内插”、“nameof 表达式”是我比较喜欢的特性。
- 静态导入【
using static指令命名了一种类型,无需指定类型名称即可访问其静态成员和嵌套类型。】 - 异常筛选器【
catch (ExceptionType [e]) when (expr)】 - 自动属性初始化表达式【
public string Foo { get; set; } = string.Empty;】 - 表达式主体定义【例如:
public override string ToString() => $"{foo} {bar}";】 Null条件运算符【成员访问?.或元素访问?[]】- 字符串内插【
$"{foo} {bar}"】 nameof表达式【nameof(Foo)】
C# 7.0
发布日期:2017 年 3 月
C# 7.0 版已与 Visual Studio 2017 一起发布。 此版本继承和发展了 C# 6.0。对应 .NET Framework 4.7、4.7.1、4.7.2。“out 变量”、“模式匹配”是我比较喜欢的特性。后续的 C# 7.1、7.2、7.3 基本都在为新特性添砖加瓦。明显开始和别的语言抄来抄去,当然我们一般都称为“借鉴”。
out变量【if (Int32.TryParse(foo, out int bar)) Console.WriteLine($"Converted '{foo}' to {bar}");】- 元组【
(double Foo, int Bar) t2 = (4.5, 3);】 - 模式匹配
- 本地函数【内部函数,让我想起了 Delphi】
- ref 局部变量【指针既视感】
- 弃元【
(_, _, foo) = bar.baz();,配合元组,你可以给,但我可以不要。】
C# 8.0
发布日期:2019 年 9 月
C# 8.0 版是专门面向 .NET C# Core 的第一个主要 C# 版本。特性列了一大篇,实在是没法看了,下面就没有一一列举,脚本语言味儿越来越重,各种操作符、关键字更是玩出花来,心智负担越发沉重了。除了模式匹配,别的特性完全不想碰。
- 默认接口方法【抽象也能顺便带点儿实现,脑抽特性】
- 模式匹配增强功能【来嘛,有点学不过来了啊】
- Null 合并赋值【
??=】 - 后面懒得列了……
C# 9
发布日期:2020 年 11 月
C# 9 随 .NET 5 一起发布。 它是面向 .NET 5 版本的任何程序集的默认语言版本。对于既存特性进行了梳理与调整,然后引入了一大堆新特性,这是有 KPI 压力吗?老特性千万别给我搞没了,新特性我也保证不碰,咱们心照不宣吧。
- 记录【
record关键字,只读数据类语法糖】 - 仅限 Init 的资源库【
public int Foo { get; init; },只读数据类语法糖之二】 - 顶级语句【为了少写点代码微软也是拼了】
- 模式匹配增强功能【继续增强……】
- 函数指针【图穷匕见,高性能计算这一块与我似乎没有交集】
- 后面懒得列了……
C# 10
发布日期:2021 年 11 月
C# 10 继续致力于删除不必要的模式、将数据与算法分离以及提高 .NET 运行时的性能等主题。特性列表又是像写小说一样长,行吧,你开心就好。
- 这次我一个也不想列……
C# 11
发布日期:2022 年 11 月
和前面比起来稍微节制了一点儿,优化了数学计算和字符串处理,模式匹配不用说,给我增强!
- 泛型数学支持【不懂】
- UTF-8 字符串字面量【"foo"u8】
- 必需的成员【
required修饰符,KPI 味太浓了】 - 其他的不列了……
后记
可以说从 6.0 开始就不干正事儿了,有实际意义的特性越来越少,性能增强、安全性加强什么的是值得肯定的,但是加的这一堆特性真是有点缺乏节制,我宁可在 11 的环境下写着 6 的代码。人家是“人生苦短”,我看微软是“只嫌命长”啊。
C# 版本特性一览的更多相关文章
- .NET Framework各版本特性一览
https://msdn.microsoft.com/en-us/library/bb822049.aspx .NET Framework version CL version Features In ...
- (数据科学学习手札129)geopandas 0.10版本重要新特性一览
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在前不久,我们非常熟悉的Python地理 ...
- (数据科学学习手札139)geopandas 0.11版本重要新特性一览
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,就在几天前,geopandas ...
- (数据科学学习手札111)geopandas 0.9.0重要新特性一览
本文示例文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在几天前,geopandas释放了其最新正式版 ...
- JBoss和Tomcat版本、及Servlet、JSP规范版本对应一览 【转】
原文地址:http://blog.csdn.net/hills/article/details/40896357 JBoss和Tomcat版本.及Servlet.JSP规范版本对应一览 JBossAS ...
- Android各版本特性
此篇文章可以利用碎片化时间进行消化和了解,针对Android各个版本特性,并没有把所有列出,只是抽出了比较常用重要的特性作为提示,同时在面试中只要牢记重要的几个点即可,其他特性直接查找官方文档即可. ...
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) C#各版本新特性 C#版本和.NET版本以及VS版本的对应关系
C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新) 2017年08月06日 11:53:13 阅读数:6705 历史版本 C#作为微软2000年以后.NET平台开发的当家语言,发展至今具有1 ...
- Java单元測试工具JUnit 5新特性一览
Java单元測试工具JUnit 5新特性一览 作者:chszs,未经博主同意不得转载. 经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs JUnit是最流行的开源 ...
- IntelliJ IDEA 16 EAP新特性一览
IntelliJ IDEA 16 EAP新特性一览 作者:chszs,未经博主同意不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs IntelliJ I ...
随机推荐
- 地铁系统PC端代码
代码顺序为项目文件顺序从上到下 package org.example.dao; import org.example.pojo.Station; import java.sql.ResultSet; ...
- Unity绘制圆和缓动雷达图
Unity绘制圆和缓动雷达图 之前在做UI模块的时候遇到过需要做雷达图的效果,所以简单复习了一下 关于网格绘制 我们都知道Unity绘制图形是通过Mesh网格添加顶点进行绘制,那么知道顶点信息后如何实 ...
- 【ACM算法竞赛日常训练】DAY5题解与分析【储物点的距离】【糖糖别胡说,我真的不是签到题目】| 前缀和 | 思维
DAY5共2题: 储物点的距离(前缀和) 糖糖别胡说,我真的不是签到题目(multiset,思维) 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通俗易懂的方式讲解算法 ...
- 使用nw.js打包以后的web项目 发布客户端
一.下载nw.js 直接前往官网下载即可 https://nwjs.io/downloads/ 二.封装最简单的客户端 nw.js下载完成后,在任意位置新建文件夹,例如nwtest,然后在文件夹中新建 ...
- JQ的尺寸类
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 谁能真正替代你?AI辅助编码工具深度对比(chatGPT/Copilot/Cursor/New Bing)
写在开头 这几个月AI相关新闻的火爆程度大家都已经看见了,作为一个被裹挟在AI时代浪潮中的程序员,在这几个月里我也是异常兴奋和焦虑.甚至都兴奋的不想拖更了.不仅仅兴奋于AI对于我们生产力的全面提升,也 ...
- vue-i18n警告
vue3引入vue-i18n警告: bundler build of vue-i18n. It is recommended to configure your bundler to explicit ...
- 成为钢铁侠!只需一块RTX3090,微软开源贾维斯(J.A.R.V.I.S.)人工智能AI助理系统
梦想照进现实,微软果然不愧是微软,开源了贾维斯(J.A.R.V.I.S.)人工智能助理系统,贾维斯(jarvis)全称为Just A Rather Very Intelligent System(只是 ...
- [网络/Linux]CentOS7:OpenSSH升级到7.9p1 | 含: 安装Telnet/OpenSSH【telnet/ssh】
[Q0 OpenSSH/sshd/ssh/scp/sftp,及OpenSSL这些软件组件之间有什么联系吗?] 请跳转咱的另一篇博文,相信阅读完后,你会清楚很多: [网络/SSH]OpenSSH: ss ...
- 活字格性能优化技巧(3):如何巧用CDN提升含页面的访问速度
本文由葡萄城技术团队于博客园原创并首发转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 上两篇中我们分享了如何利用数据库主键和表格设置默认不加载数据来提升应用 ...