马建文 發表於 2023-6-6 09:39:00

C# 版本特性一览

<h2 id="前言">前言</h2>
<p>使用 C# 作为开发语言已经 15 个年头了,受惠于 C# 的不断更新,伴随着大量的新特性与大量语法糖,让我更加容易写出简洁、高效的代码。日常中大量特性早已信手拈来,当然从未尝试过的特性更是难以尽数,但是每每回忆代码中的特性究竟是哪个版本引入的,却颇为含糊。索性简单整理记录下来,用以备忘,进而能够更精确地根据想使用的特性确定程序需要的 Framework 版本。<br>
尽管参考了微软的官方文档,但所列特性难免基于我所接触使用到的狭隘范围,用中括号附上短评(如【我是短评】),用以提示,希望不至于画蛇添足吧。</p>
<h2 id="版本一览">版本一览</h2>
<h3 id="c-10">C# 1.0</h3>
<p>发布日期:2002 年 1 月<br>
一切的开始,由于我是从 2.0 开始接触 C# 的,在此不赘述该版本了,只能说 C# 的起点不低,从 Java 转过来上手很快,兼具 C 语族的语法特点,同时又很有 Delphi 味,简直梦幻开局。</p>
<h3 id="c-12">C# 1.2</h3>
<p>发布日期:2003 年 4 月<br>
从此版本开始,当 <code>IEnumerator</code> 实现 <code>IDisposable</code> 时,<code>foreach</code> 循环中生成的代码会在 <code>IEnumerator</code> 上调用 <code>Dispose</code>。【刚刚知道还有这特性】</p>
<h3 id="c-20">C# 2.0</h3>
<p>发布日期:2005 年 11 月<br>
和 Visual Studio 2005 一起发布。看看这些金光闪闪的特性吧:</p>
<ul>
<li>泛型</li>
<li>分部类型【<code>partial</code> 关键字】</li>
<li>匿名方法【利用 <code>delegate</code> 运算符】</li>
<li>可为空的值类型【<code>Nullable&lt;T&gt;</code> 或 <code>T?</code> 】</li>
<li>迭代器【<code>yield return</code> 语句】</li>
<li>协变和逆变【这时候还不支持泛型接口和委托】</li>
<li><code>getter/setter</code> 单独可访问性</li>
<li>静态类</li>
</ul>
<h3 id="c-30">C# 3.0</h3>
<p>发布日期:2007 年 11 月<br>
C# 3.0 和 Visual Studio 2008 一起发布于 2007 年下半年,但完整的语言功能是在 <code>.NET Framework 3.5</code> 版中发布的。如果说 2.0 时期是分庭抗礼,那么到了 3.0 就真的是一骑绝尘,诸多特性完美地结合在一起。尽管我习惯用 <code>Lambda</code> 表达式与链式调用来写 <code>LINQ</code> ,但是查询表达式写法的 <code>LINQ</code> 实在是太惊艳了。</p>
<ul>
<li>自动实现的属性【<code>{ get; set; }</code> 写法】</li>
<li>匿名类型【<code>new { Foo = 108, Bar = "Hello" }</code> 写法】</li>
<li>查询表达式【<code>from foo select bar where baz</code> 写法】</li>
<li>Lambda 表达式</li>
<li>表达式树</li>
<li>扩展方法</li>
<li>隐式类型本地变量【<code>var</code> 关键字】</li>
<li>分部方法【<code>partial</code> 关键字可以作用在方法上,没用过该特性】</li>
<li>对象和集合初始值设定项【<code>Foo foo = new Foo { Bar = "Hello" }</code> 写法】</li>
<li>WPF、WCF、WF</li>
</ul>
<h3 id="c-40">C# 4.0</h3>
<p>发布日期:2010 年 4 月<br>
C# 版本 4.0 随 Visual Studio 2010 一起发布,引入了一些小改进。</p>
<ul>
<li>动态绑定【<code>dynamic</code> 关键字,不在编译时检查类型,而是在运行时评估。】</li>
<li>命名实参和可选实参【可以少些一些方法重载了】</li>
<li>泛型协变和逆变【完全体,但一般只有底层类库设计者需要考虑这玩意】</li>
<li>嵌入的互操作类型【没什么存在感】</li>
<li><code>System.Threading.Tasks</code> 命名空间【更方便的线程操作及并行处理】</li>
<li><code>System.Tuple</code> 类</li>
<li>现有类的新方法【例如 <code>String.IsNullOrWhiteSpace</code>、<code>Stopwatch.Restart</code>、<code>StringBuilder.Clear</code> 等等】</li>
<li>现有方法的新重载【例如 <code>String.Join</code> 方法添加了可以连接 <code>IEnumerable&lt;T&gt;</code> 集合的成员的新重载。】</li>
<li>Managed Extensibility Framework (MEF)【动态加载,实现插件系统的好帮手】</li>
<li>ASP.NET MVC</li>
</ul>
<h3 id="c-50">C# 5.0</h3>
<p>发布日期:2012 年 8 月<br>
C# 版本 5.0 随 Visual Studio 2012 一起发布。.NET Framework 4.5、4.5.1、4.5.2 基本上就是一系列更新和优化,新东西很少。</p>
<ul>
<li>异步成员【<code>async</code> 和 <code>await</code>,版本之子。】</li>
<li>调用方信息特性【<code>CallerMemberName</code> 等,方便确定调用方信息。】</li>
</ul>
<h3 id="c-60">C# 6.0</h3>
<p>发布日期:2015 年 7 月<br>
版本 6.0 随 Visual Studio 2015 一起发布,发布了很多使得 C# 编程更有效率的小功能。对应 .NET Framework 4.6、4.6.1、4.6.2。<code>.NET Core</code> 出现了,好消息是 <code>.NET</code> 开放源码了,坏消息是微软开始折腾,从这开始语法糖多得齁嗓子。得益于诸多新特性,代码变得简短了,但是引入了很多新符号,心智负担加重了。“<code>Null</code> 条件运算符”、“字符串内插”、“<code>nameof</code> 表达式”是我比较喜欢的特性。</p>
<ul>
<li>静态导入【<code>using static</code> 指令命名了一种类型,无需指定类型名称即可访问其静态成员和嵌套类型。】</li>
<li>异常筛选器【<code>catch (ExceptionType ) when (expr)</code>】</li>
<li>自动属性初始化表达式【<code>public string Foo { get; set; } = string.Empty;</code>】</li>
<li>表达式主体定义【例如:<code>public override string ToString() =&gt; $"{foo} {bar}";</code>】</li>
<li><code>Null</code> 条件运算符【成员访问<code>?.</code> 或元素访问<code>?[]</code>】</li>
<li>字符串内插【<code>$"{foo} {bar}"</code>】</li>
<li><code>nameof</code> 表达式【<code>nameof(Foo)</code>】</li>
</ul>
<h3 id="c-70">C# 7.0</h3>
<p>发布日期:2017 年 3 月<br>
C# 7.0 版已与 Visual Studio 2017 一起发布。 此版本继承和发展了 C# 6.0。对应 .NET Framework 4.7、4.7.1、4.7.2。“<code>out</code> 变量”、“模式匹配”是我比较喜欢的特性。后续的 C# 7.1、7.2、7.3 基本都在为新特性添砖加瓦。明显开始和别的语言抄来抄去,当然我们一般都称为“借鉴”。</p>
<ul>
<li><code>out</code> 变量【<code>if (Int32.TryParse(foo, out int bar)) Console.WriteLine($"Converted '{foo}' to {bar}");</code>】</li>
<li>元组【<code>(double Foo, int Bar) t2 = (4.5, 3);</code>】</li>
<li>模式匹配</li>
<li>本地函数【内部函数,让我想起了 Delphi】</li>
<li>ref 局部变量【指针既视感】</li>
<li>弃元【<code>(_, _, foo) = bar.baz();</code>,配合元组,你可以给,但我可以不要。】</li>
</ul>
<h3 id="c-80">C# 8.0</h3>
<p>发布日期:2019 年 9 月<br>
C# 8.0 版是专门面向 .NET C# Core 的第一个主要 C# 版本。特性列了一大篇,实在是没法看了,下面就没有一一列举,脚本语言味儿越来越重,各种操作符、关键字更是玩出花来,心智负担越发沉重了。除了模式匹配,别的特性完全不想碰。</p>
<ul>
<li>默认接口方法【抽象也能顺便带点儿实现,脑抽特性】</li>
<li>模式匹配增强功能【来嘛,有点学不过来了啊】</li>
<li>Null 合并赋值【<code>??=</code>】</li>
<li>后面懒得列了……</li>
</ul>
<h3 id="c-9">C# 9</h3>
<p>发布日期:2020 年 11 月<br>
C# 9 随 .NET 5 一起发布。 它是面向 .NET 5 版本的任何程序集的默认语言版本。对于既存特性进行了梳理与调整,然后引入了一大堆新特性,这是有 KPI 压力吗?老特性千万别给我搞没了,新特性我也保证不碰,咱们心照不宣吧。</p>
<ul>
<li>记录【<code>record</code> 关键字,只读数据类语法糖】</li>
<li>仅限 Init 的资源库【<code>public int Foo { get; init; }</code> ,只读数据类语法糖之二】</li>
<li>顶级语句【为了少写点代码微软也是拼了】</li>
<li>模式匹配增强功能【继续增强……】</li>
<li>函数指针【图穷匕见,高性能计算这一块与我似乎没有交集】</li>
<li>后面懒得列了……</li>
</ul>
<h3 id="c-10-1">C# 10</h3>
<p>发布日期:2021 年 11 月<br>
C# 10 继续致力于删除不必要的模式、将数据与算法分离以及提高 .NET 运行时的性能等主题。特性列表又是像写小说一样长,行吧,你开心就好。</p>
<ul>
<li>这次我一个也不想列……</li>
</ul>
<h3 id="c-11">C# 11</h3>
<p>发布日期:2022 年 11 月<br>
和前面比起来稍微节制了一点儿,优化了数学计算和字符串处理,模式匹配不用说,给我增强!</p>
<ul>
<li>泛型数学支持【不懂】</li>
<li>UTF-8 字符串字面量【"foo"u8】</li>
<li>必需的成员【<code>required</code> 修饰符,KPI 味太浓了】</li>
<li>其他的不列了……</li>
</ul>
<h2 id="后记">后记</h2>
<p>可以说从 6.0 开始就不干正事儿了,有实际意义的特性越来越少,性能增强、安全性加强什么的是值得肯定的,但是加的这一堆特性真是有点缺乏节制,我宁可在 11 的环境下写着 6 的代码。人家是“人生苦短”,我看微软是“只嫌命长”啊。</p>


</div>
<div id="MySignature" role="contentinfo">
    <div id="GYPSign">
<div>作者:高云鹏</div>
<div>出处:https://gaoyunpeng.cnblogs.com/</div>
<img alt="知识共享许可协议" style="border-width: 0" src="https://i.creativecommons.org/l/by-nc/4.0/88x31.png"><br>本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。</div>
<br id="footbr"><br><br>
来源:https://www.cnblogs.com/gaoyunpeng/p/17459660.html
頁: [1]
查看完整版本: C# 版本特性一览