13

代码演示C#各版本新功能

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzU4Mjc4NzgyOQ%3D%3D&%3Bmid=2247484790&%3Bidx=2&%3Bsn=ed17553e64e6cbaa2e3ffd64015393a1
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

vAVNbm6.gif

代码演示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

asyncawait 的本质是状态机,像  IEnumerable<T> 一样。以前游戏引擎  Unity 只支持  C# 3.0 ,因此当时它用状态机发  Http 请求是用的  IEnumerable<T>

asyncawait 有两个好处,一是可以避免  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开发实战视频课程   ★★★

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

【.NET Core微服务实战-统一身份认证】开篇及目录索引

Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

10个小技巧助您写出高性能的ASP.NET Core代码

用abp vNext快速开发Quartz.NET定时任务管理界面

现身说法:实际业务出发分析百亿数据量下的多表查询优化

关于C#异步编程你应该了解的几点建议

C#异步编程看这篇就够了

给我好看

NJfYJfq.jpg!web

您看此文用

·

秒,转发只需1秒呦~

nqIBZv6.png!web

好看你就

点点


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK