C#7.0新特性和语法糖详解
转自IT之家网--DotNet码农:https://www.ithome.com/html/win10/305148.htm
伴随Visual Studio 2017的发布,C#7.0开始正式走上工作岗位。对于早已熟悉了旧版本C#的开发者来说,C#7.0增加的不少新特性和语法糖能在很大程度上提升编程效率并降低出错率。本文将阐述C#7.0给出的9个改进。
1、元组——更优雅地返回多个值
之所以将元组放在第一位,是因为它对C#编程体验的提升实在是太大了。元组这个概念在以前就已经被引入了C#,只不过它是通过一个名为Tuples的泛型类来实现的。使用这个泛型类虽然可以达到类似元组的效果,但是可读性实在是太差了,完全就没有办法通过代码理解函数返回的到底是什么,本应该是人类友好的参数名不得不变成Item1、Item2这样的抽象名称。也正是因为如此,一般的开发者更倾向于自己定义一个结构来用于返回多个值。
C#7.0引入的元组语法能让你更优雅地完成这一任务。你可以通过这种方式来表示一个函数的返回值类型:

在外部代码里,你可以这样来访问这个元组类型包含的多个值:

这可比先前C#版本里,用Item1、Item2、Item3来表示元组元素的方法直观多了,你也不必写着写着就要回去查看自己的函数返回的顺序是怎样的了。
当然,如果你不想用类型推断和匿名元组类型的话,你还能这样解构一个元组:

使用元组的前提,是你引用了来自微软官方的System.ValueTuple包:

2、局部函数——函数作用域新玩法
鉴于元组可能会炸脑,所以现在来点轻松的——局部函数,这是比较容易理解的一个新特性。简而言之,现在可以在函数里定义函数了,而且通常这个函数里的函数只能在外层函数里访问。直接上例子:

3、引用传递和引用返回——不必担心值类型的引用传递
熟悉C#的朋友肯定知道,如果操作数是值类型,那么赋值运算符(等号)默认传递是这个类型的值;但是某些时候,我们不希望C#“自作聪明”地给我们传递值,而希望传递这个值类型的引用。在C#7.0中,微软重新利用了使用率不高的关键字ref,来表明我们要传递的是一个引用而不是值。下面是实例:

这段程序的输出结果是3,而不是通常认为的0。原因是中间的那句赋值,我们告诉C#,我们要传递的是引用,而不是值。所以后来对b的值作出修改,a的值同步改变了。
类似的,我们可以用相同的方式来让一个函数返回一个值类型的引用而不是它的值:

4、模式——比较和匹配的新玩法
作为一门基于类型的语言,“封箱”和“拆箱”操作肯定深入人心。拆箱之前,我们经常需要判断这个箱子到底是什么类型的(is运算符)。以前版本的C#有个模板式的写法是:先用is运算符判断封箱类型,然后用as运算符拆箱。现在这个模板式的语法可以被缩写成这样了:

不仅如此,C#7.0把这种东西称作“模式匹配”,这让你能用switch/case语句来批量判断封箱类型,并用when关键字来限定拆箱结果的条件。比如:

5、语法糖——out变量直接定义
以前在使用带有out参数的函数的时候,我们必须先把要赋值的out参数定义好,在传递给函数。现在可以直接在传递的时候定义out参数了:

6、通用异步返回类型
通常来说,异步方法返回类型必须是void,Task或者Task,这种方式的明显缺点,就是会在等待时但异步结果已经可用的情况下,对Task进行分配。C#7.0加入了ValueTask泛型类型,用来解决上述问题,这能显著提升部分异步程序的性能。简而言之,ValueTask会创建一个cache,用来缓存已经可用的值,而不至于每一次都等待一个相同的异步方法执行完全相同的步骤。举例子的话篇幅会比较长,所以烦请大家自己查阅MSDN。
7、语法糖——λ表达式现在支持了更多的函数
在C#7.0中,构造函数、析构函数和属性访问器也可以使用λ表达式了,比如:



8、语法糖——异常表达式
新增的运算符??(两个半角问号)用于在引用为null的时候抛出异常:

9、语法糖——数字里可以添加下划线增强可读性
现在C#7.0认为,1234_5678和12345678是一个数字了。也就是,数字中的下划线会被忽略。
总结:
C#7.0加入的新特性和语法糖可以非常有效地提升我们编程的效率,也更有利于降低错误率。了解它们,对以后的工作将带来极大的帮助。
C#7.0新特性和语法糖详解的更多相关文章
- Java 语法糖详解
语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法. 这种语法对语言的功能并没有影响,但是 ...
- Java语法糖详解
语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更 ...
- 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)
方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...
- 【repost】H5的新特性及部分API详解
h5新特性总览 移除的元素 纯表现的元素: basefont.big.center.font等 对可用性产生负面影响的元素: frame.frameset.noframes 新增的API 语义: 能够 ...
- iOS10新特性之CallKit开发详解:锁屏接听和来电识别
国庆节过完了,回家好好休息一天,今天好好分享一下CallKit开发.最近发现好多吃瓜问CallKit的VoIP开发适配,对iOS10的新特性开发和适配也在上个月完成,接下来就分享一下VoIP应用如何使 ...
- using语法糖详解 2015-01-06 17:45 50人阅读 评论(0) 收藏
前段事件在using外套try catch 突然想到,如果出现异常 会不会执行释放,不执行的话那服务器很可能导致崩溃... 特意上了CSDN问了大神..得到了答案.. Using相等于try catc ...
- C++11中新特性之:initializer_list详解
C++11提供的新类型,定义在<initializer_list>头文件中. template< class T > class initializer_list; 先说它的用 ...
- C# 7.0 新特性1: 基于Tuple的“多”返回值方法
本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...
- C# 7.0 新特性3: 模式匹配
本文参考Roslyn项目Issue:#206,及Docs:#patterns. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# ...
随机推荐
- 前端开发HTML&css入门——伪类选择器和一些特殊的选择器
伪类和伪元素 有时候,你需要选择本身没有标签,但是仍然易于识别的网页部位,比如段落首行或鼠标滑过的连接.CSS为他们提供一些选择器:伪类和伪元素. 常用的一些伪类选择器: :link :visited ...
- redis基础及redis特殊场景使用描述
数据类型 String set list hash zset redis原理 单线程:redis是单线程+io多路复用:检查文件描述的就绪状态 对比memchached:多线程+锁 redis优势 解 ...
- ubuntu 安装nvidia driver
错误的命令:sudo apt-get install nvidiar-430好多教程都是这样 sudo apt-get install nvidia-driver-430 很奇怪这个命令变成这样 h ...
- 你真的懂git rebase吗?
前段时间由于某种原因,开始接手开发公司前端Vue搭建的项目 该前端项目采用的是基于git rebase的形式去合并代码,而我之前使用git一直都是采用merge的形式合并分支代码,对于rebase一概 ...
- bzoj3011 [Usaco2012 Dec]Running Away From the Barn 左偏树
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3011 题解 复习一下左偏树板子. 看完题目就知道是左偏树了. 结果这个板子还调了好久. 大概已 ...
- HDU-4280-Island Transport(网络流,最大流, ISAP)
链接: https://vjudge.net/problem/HDU-4280 题意: In the vast waters far far away, there are many islands. ...
- Intraweb IIS发布,数据连接问题
日前,用IW做了小东西,开始用单独的执行程序发布,一切都没有什么问题,但是发布到正式环境中,用windows IIS发布,怎么也获取不了程序所在的物理路径,而后看了万一的博客,试了一下程序能正常运行, ...
- new Date(str)返回 Invalid date问题
var date=new Date($("input[name='mettingTime']").val().replace(/-/g, "/")); var ...
- Minimum Cut
Minimum Cut Time Limit: 3000/2000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)Tota ...
- 【MySQL】 知识点记录
0. 定位和排查问题的常用语句 查询 正在执行的事务(这个输出有事物状态表明是否等待锁):SELECT * FROM information_schema.INNODB_TRX 查看正在锁的事务:SE ...