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# ...
随机推荐
- css渐变色兼容性写法
background: -webkit-linear-gradient(left, #0f0f0f, #0c0c0c, #272727); /* Safari 5.1 - 6.0 */ backgro ...
- tp5 微信授权
protected $appid = '****************'; //微信 appidprotected $appsecrt = '******************'; //微信 ap ...
- 构建游戏开发的大数据项目的流程demo图
- pyqt5-橡皮筋控件QRubberBand
提供一个矩形或线来指示选择或边界 一般结合鼠标事件一同协作 继承于 QWidget import sys from PyQt5.QtWidgets import QApplication, QWidg ...
- 【宝藏】题解(五校联考3day1)
分析 如果打爆搜的话可以拿60分. 首先知道期望是可以累加的,即i通过j去到k的期望,等于i去到j的期望加j去到k的期望. 所以令d[i]表示i的出度,F[i]表示从i到i的父亲的期望,G[i]表示i ...
- 面试题常考&必考之--js数组排序冒泡排序和快速排序
冒泡排序: 原理:比较相邻的元素,将值大的元素交换到右边.(如果相等不进行交换) 实例: 要排列数组:[10,1,35,61,89,36,55] 第一趟排序: 第1次排序:10和1比较,10>1 ...
- Bugku web web2
web2 打开后发现是个大滑稽啊!F12检查元素拿到flag
- Java——常用类(String)
[常用类] <1>字符串相关类(String.StringBuffer) <2>基本数据类型包装类 <3>Math类 <4>File类 ...
- codevs 1098 均分纸牌 2002年NOIP全国联赛提高组 x
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有 N 堆纸牌,编号分别为 1,2,…, N.每堆上有若干张,但纸牌总数必 ...
- linux入门 一些常见命令
chvt 切换终端 用法 1是终端 7是图形界面 sudo chvt 1 or 7 cp 复制文件/目录 -a : 通常在复制目录时使用,保存链接,文件属性并递归复制目录 -f:若文件在目标路径中则强 ...