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

栏目: IT技术 · 发布时间: 4年前

内容简介:您看此文用·秒,转发只需1秒呦~

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

代码演示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#异步编程看这篇就够了

给我好看

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

您看此文用

·

秒,转发只需1秒呦~

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

好看你就

点点


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

信息论基础

信息论基础

Thomas M.Cover、Joy A.Thomas / 清华大学出版社 / 2003-11-1 / 65.00元

《国际知名大学原版教材•信息论基础》系统介绍了信息论基本原理及其在通信理论、统计学、计算机科学、概率论以及投资理论等领域的应用。作者以循序渐进的方式,介绍了信息量的基本定义、相对熵、互信息以及他们如何自然地用来解决数据压缩、信道容量、信息率失真、统计假设、网络信息流等问题。一起来看看 《信息论基础》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

html转js在线工具
html转js在线工具

html转js在线工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具