内容简介:您看此文用·秒,转发只需1秒呦~
代码演示C#各版本新功能
C#
各版本新功能其实都能在官网搜到,但很少有人整理在一起,并通过 非常简短
的代码将每个新特性演示出来。
-
代码演示C#各版本新功能
-
C# 2.0版 - 2005
-
泛型
-
分部类型
-
匿名方法
-
可以为null的值类型
-
迭代器
-
协变和逆变
-
C# 3.0版 - 2007
-
自动实现的属性
-
匿名类型
-
查询表达式(LINQ)
-
Lambda表达式
-
表达式树
-
扩展方法
-
var
-
分部方法
-
对象和集合初始值设定项
-
C# 4.0版 - 2010
-
dynamic
-
命名参数/可选参数
-
泛型中的协变和逆变
-
类型等效、内置互操作类型
-
C# 5.0版 - 2012
-
async/await
-
调用方信息
-
C# 6.0版 - 2015
-
静态导入
-
异常筛选器
-
自动初始化表达式
-
Expression-bodied 函数成员
-
Null传播器
-
字符串内插
-
nameof
表达式 -
索引初始值设定项
-
C# 7.0版本 - 2017
-
out变量
-
元组和析构函数
-
模式匹配
-
本地函数
-
更多的expression-bodied成员
-
Ref 局部变量和返回结果
-
弃元
-
二进制文本和数字分隔符
-
throw表达式
-
C# 8.0 版 - 2019
-
Readonly 成员
-
默认接口方法
-
模式匹配增强
-
属性模式
-
Tuple模式
-
位置模式
-
switch表达式
-
using声明
-
静态本地函数
-
异步流
-
索引和范围
-
Null合并赋值
-
非托管构造类型
-
嵌套表达式中的 stackalloc
-
附录/总结
C# 2.0版 - 2005
泛型
Java
中的泛型不支持值类型,且会运行时类型擦除,这一点 .NET
更优秀。
分部类型
拆分一个类、一个结构、一个接口或一个方法的定义到两个或更多的文件中是可能的。每个源文件包含类型或方法定义的一部分,编译应用程序时将把所有部分组合起来。
匿名方法
可以为null的值类型
迭代器
协变和逆变
在 C# 中,协变和逆变能够实现数组类型、委托类型和泛型类型参数的隐式引用转换。协变保留分配兼容性,逆变则与之相反。
C# 3.0版 - 2007
自动实现的属性
匿名类型
查询表达式(LINQ)
LINQ
允许你可以像写 SQL
一样写 C#
代码,像这样:
LINQ
的意义在于让 C#
做出了重大调整,本章中说到的 lambda
表达式、扩展方法、表达式树、匿名类型、自动属性等,都是 LINQ
的必要组成部分。
由于用扩展方法的形式也能得到一致的结果,而且还能让代码风格更加一致,所以我平时用 LINQ
语法较少:
Lambda表达式
表达式树
这个是 LINQ
的基础之一,它的作用是将代码像数据一样,保存在内存中;然后稍后对这些“代码数据”进行重新解释/执行。
EntityFramework
就是一个经典场景,它先将表达式树保存起来,然后执行时,将其翻译为 SQL
发给数据库执行。
注意:表达式树并不能表示所有的代码, C# 3.0
之后的语法,包含 ??
、 ?.
、 asyncawait
、可选参数等,都无法放到表达式树中。据说官方准备更新它,但迟迟没有进展。
扩展方法
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。
var
分部方法
对象和集合初始值设定项
C# 4.0版 - 2010
dynamic
这个是特性使得 CLR
不得不进行一次修改。有了这个, C#
也能像 js
、 php
、 python
等弱类型语言一样写代码了。
注意 dynamic
可以表示任何东西,包含数组、委托等等。滥用 dynamic
容易让程序变得很难维护。
命名参数/可选参数
泛型中的协变和逆变
类型等效、内置互操作类型
这个主要是为了和 COM
进行交互。之前需要引用一些 COM
类型相关的程序集,现在可以直接引用 COM
。具体可以参见:https://docs.microsoft.com/zh-cn/dotnet/framework/interop/type-equivalence-and-embedded-interop-types
C# 5.0版 - 2012
async/await
async
/ await
的本质是状态机,像 IEnumerable<T>
一样。以前游戏引擎 Unity
只支持 C# 3.0
,因此当时它用状态机发 Http
请求是用的 IEnumerable<T>
。
async
/ await
有两个好处,一是可以避免 UI
线程卡顿,二是提高系统吞吐率,最终提高性能。
调用方信息
注意这个是编译期生成的,因此比 StackTrace
更能保证性能。
C# 6.0版 - 2015
静态导入
终于可以不用写静态类名了。
异常筛选器
在 try-catch
时,可以按指定的条件进行 catch
,其它条件不 catch
。
自动初始化表达式
Expression-bodied 函数成员
Null传播器
字符串内插
nameof
表达式
有时字符串值和某个变量名称一致,尤其是在做参数验证时。这里 nameof
就能在编译期,自动从变量名生成一个字符串。
索引初始值设定项
使集合初始化更容易的另一个功能是对 Add 方法使用扩展方法 。添加此功能的目的是进行 Visual Basic 的奇偶校验。如果自定义集合类的方法具有通过语义方式添加新项的名称,则此功能非常有用。
C# 7.0版本 - 2017
out变量
元组和解构函数
解构是将元组转换为变量。//忽略…构函数应该类似C++中的析构函数,在实例回收时执行?
模式匹配
现在可以在匹配一个类型时,自动转换为这个类型的变量,如果转换失败,这个变量就赋值为默认值( null
或 0
)。
极简版:
switch/case版:
本地函数
这个主要是方便, javascript
就能这样写。
比 lambda
的好处在于,这个可以定义在后面,而 lambda
必须定义在前面。
更多的expression-bodied成员
该功能可以让一些函数写成表达式的形式,非常的方便。
Ref 局部变量和返回结果
此功能允许使用并返回对变量的引用的算法,这些变量在其他位置定义。一个示例是使用大型矩阵并查找具有某些特征的单个位置。
这个功能主要是为了提高值类型的性能,让它真正发挥其作用。 C++
就有类似的功能。
弃元
通常,在进行元组解构或使用 out
参数调用方法时,必须定义一个其值无关紧要且你不打算使用的变量。为处理此情况, C#
增添了对弃元的支持 。弃元是一个名为 _
的只写变量,可向单个变量赋予要放弃的所有值。弃元类似于未赋值的变量;不可在代码中使用弃元(赋值语句除外)。
二进制文本和数字分隔符
这个用于使数字和二进制更可读。
throw表达式
throw
之前必须是一个语句,因此有时不得不写更多的代码来完成所需功能。但 7.0
提供了 throw
表达式来使代码更简洁,阅读更轻松。
C# 8.0 版 - 2019
Readonly 成员
默认接口方法
接口中也能定义方法了,这个新功能经常受到争论。但想想,有时是先定义接口,而实现接口需要实现很多相关、但又繁琐的功能,如 ASP.NETCore
中的 ILogger
,谁用谁知道,特别多需要实现的方法,但又都差不多。因此所以这个功能其实很有必要。
模式匹配增强
这个是为简化代码、函数式编程而生的,我个人非常喜欢。
属性模式
Tuple模式
位置模式
switch表达式
这个功能能使代码从大量的 if/else
或 switch/case
变成“一行代码”,符合函数式编程的思想,非常好用!
using声明
静态本地函数
相比非静态本地函数,静态本地函数没有闭包,因此生成的代码更少,性能也更容易控制。
异步流
这个功能和 IEnumerable<T>
、 Task<T>
对应,一个经典的表格如下:
单值 | 多值 | |
---|---|---|
同步 | T | IEnumerable |
异步 | Task | ? |
其中,这个问号 ?
终于有了答案,它就叫异步流—— IAsyncEnumerable<T>
:
不像 IEnumerable<T>
, IAsyncEnumerable<T>
系统还没有内置扩展方法,因此可能没有 IEnumerable<T>
方便, 但是
可以通过安装 NuGet
包 f
来实现和 IEnumerable<T>
一样(或者更爽)的效果。
索引和范围
和 Python
中的切片器一样,只是 -
用 ^
代替了。
Null合并赋值
非托管构造类型
与任何非托管类型一样,可以创建指向此类型的变量的指针,或针对此类型的实例在堆栈上分配内存块
嵌套表达式中的 stackalloc
附录/总结
这么多功能,你印象最深刻的是哪个呢?
参考资料:C#发展历史 - C#指南 | Microsoft Docs
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-version-history
本文内容和代码由 肖鹏
整理,有大量修改;转载已获得肖鹏本人授权。 肖鹏
是我公司从 Java
转 .NET
的同事。原文链接为:https://akiyax.github.io/new-features-in-csharp/。
往期 精彩 回顾
.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
【.NET Core微服务实战-统一身份认证】开篇及目录索引
Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)
.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
给我好看
您看此文用
·
秒,转发只需1秒呦~
好看你就
点点
我
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 堆排序动画演示,Python代码演示,看不懂你砍我!
- GraphQL案例演示
- Kubernetes身份验证机制演示
- 中心极限定理的Matlab演示
- 中心极限定理的Matlab演示
- Activity启动模式(GIF 动态演示)
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。