tnblog
首页
视频
资源
登录
什么时候才能领悟,取之越多失之越多
排名
5
文章
229
粉丝
15
评论
7
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

C#,.NET 各版本特性

5592人阅读 2023/6/6 22:26 总访问:1162409 评论:0 收藏:0 手机
分类: .NET

前言

使用 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 运算符】
  • 可为空的值类型【NullableT?
  • 迭代器【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.IsNullOrWhiteSpaceStopwatch.RestartStringBuilder.Clear 等等】
  • 现有方法的新重载【例如 String.Join 方法添加了可以连接 IEnumerable 集合的成员的新重载。 】
  • 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 基本上就是一系列更新和优化,新东西很少。

  • 异步成员【asyncawait,版本之子。】
  • 调用方信息特性【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 月

原文:https://www.cnblogs.com/gaoyunpeng/p/17459660.html


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

net core 使用 EF Code First

下面这些内容很老了看这篇:https://www.tnblog.net/aojiancc2/article/details/5365 项目使用多层,把数据库访问...

cAPS.net 保存base64位格式的图片

publicvoidUpload() { //取出图片对应的base64位字符 stringimgBase=Request["imgBase"]; //c#里边的base6...

Quartz.net实例动态改变周期调度。misfire、Cron

Quartz:Java编写的开源的任务调度作业框架 类似Timer之类定时执行的功能,但是更强大Quartz.NET:是把Quartz转成C# NuGet...

.net Windows服务发布、安装、卸载、监听脚本。服务调试

一、脚本 为方便不用每次都去写安装卸载的脚本1.安装脚本@echooff @echo开始安装【服务】 %SystemRoot%\Microsoft.NET\Fr...

c、VB.net中全角半角转换方法

///<summary> ///转全角的函数(SBCcase) ///</summary> ///<paramname="input">任意字符串...

.net mvc分部页,.net core分部页

.net分部页的三种方式第一种:@Html.Partial("_分部页")第二种:@{ Html.RenderPartial("分部页");}...

C.net 配合小程序实现经过第三方服务器中转文件

某些时候,微信小程序前段上传文件的时候需要经过第三方服务器再将文件上传到客户的服务器;操作如下:1:(小程序内向中端服...

.net实现QQ邮箱发送邮件功能

1、微软已经帮我们封装好了发送邮件的类MailMessage,MailMessage类构造一些邮件信息,然后通过SmtpClient进行邮件发送。Mai...

StackExchange.Redis操作redis(net core支持)

官方git开源地址https://github.com/StackExchange/StackExchange.Redis官方文档在docs里边都是官方的文档通过nuget命令下...

windows 自带的netsh进行端口映射

使用netsh 把本地任意ip的25566端口 映射到192.168.81.234的25565端口netshinterfaceportproxyaddv4tov4listenaddress=0.0....

确保.net程序始终以管理员身份运行

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingSystem.Threading.Tasks; ...

ASP.net Timer细节处理

Timer的用法:1:本人称之为计时器,是asp.net官方的一种。用法即是计时所用 2:关于计时有很多中方式,本人学识有限,暂...

.net core 使用session

tip:net core 2.2后可以直接启用session了,不用在自己添加一次session依赖,本身就添加了使用nuget添加引用Microsoft.AspN...

通俗易懂,什么是.net?什么是.net Framework?什么是.net core?

朋友圈@蓝羽 看到一篇文章写的太详细太通俗了,搬过来细细看完,保证你对.NET有个新的认识理解原文地址:https://www.cnblo...

asp.net core2.0 依赖注入 AddTransient与AddScoped的区别

asp.net core主要提供了三种依赖注入的方式其中AddTransient与AddSingleton比较好区别AddTransient瞬时模式:每次都获取一...