C#7.0新特性和语法糖详解

摘要:
随着Visual Studio 2017的发布,C#7.0正式开始工作。对于已经熟悉旧版本C#的开发人员来说,C#7.0中添加的许多新特性和语法糖可以大大提高编程效率并降低错误率。本文将描述C#7.0中给出的9项改进。C#7.0中引入的元组语法允许您更优雅地完成此任务。在C#7.0中,Microsoft重新使用了低使用率关键字ref来表示我们正在传递引用而不是值。C#7.0添加了ValueTask泛型类型来解决上述问题,这可以显著提高一些异步程序的性能。

伴随Visual Studio 2017的发布,C#7.0开始正式走上工作岗位。对于早已熟悉了旧版本C#的开发者来说,C#7.0增加的不少新特性和语法糖能在很大程度上提升编程效率并降低出错率。本文将阐述C#7.0给出的9个改进。

1、元组——更优雅地返回多个值

之所以将元组放在第一位,是因为它对C#编程体验的提升实在是太大了。元组这个概念在以前就已经被引入了C#,只不过它是通过一个名为Tuples的泛型类来实现的。使用这个泛型类虽然可以达到类似元组的效果,但是可读性实在是太差了,完全就没有办法通过代码理解函数返回的到底是什么,本应该是人类友好的参数名不得不变成Item1、Item2这样的抽象名称。也正是因为如此,一般的开发者更倾向于自己定义一个结构来用于返回多个值。

C#7.0引入的元组语法能让你更优雅地完成这一任务。你可以通过这种方式来表示一个函数的返回值类型:

C#7.0新特性和语法糖详解第1张

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

C#7.0新特性和语法糖详解第2张

这可比先前C#版本里,用Item1、Item2、Item3来表示元组元素的方法直观多了,你也不必写着写着就要回去查看自己的函数返回的顺序是怎样的了。

当然,如果你不想用类型推断和匿名元组类型的话,你还能这样解构一个元组:

C#7.0新特性和语法糖详解第3张

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

C#7.0新特性和语法糖详解第4张

2、局部函数——函数作用域新玩法

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

C#7.0新特性和语法糖详解第5张

3、引用传递和引用返回——不必担心值类型的引用传递

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

C#7.0新特性和语法糖详解第6张

这段程序的输出结果是3,而不是通常认为的0。原因是中间的那句赋值,我们告诉C#,我们要传递的是引用,而不是值。所以后来对b的值作出修改,a的值同步改变了。

类似的,我们可以用相同的方式来让一个函数返回一个值类型的引用而不是它的值:

C#7.0新特性和语法糖详解第7张

4、模式——比较和匹配的新玩法

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

C#7.0新特性和语法糖详解第8张

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

C#7.0新特性和语法糖详解第9张

5、语法糖——out变量直接定义

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

C#7.0新特性和语法糖详解第10张

6、通用异步返回类型

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

7、语法糖——λ表达式现在支持了更多的函数

在C#7.0中,构造函数、析构函数和属性访问器也可以使用λ表达式了,比如:

C#7.0新特性和语法糖详解第11张

C#7.0新特性和语法糖详解第12张

8、语法糖——异常表达式

新增的运算符??(两个半角问号)用于在引用为null的时候抛出异常:

C#7.0新特性和语法糖详解第13张

9、语法糖——数字里可以添加下划线增强可读性

现在C#7.0认为,1234_5678和12345678是一个数字了。也就是,数字中的下划线会被忽略。

总结:

C#7.0加入的新特性和语法糖可以非常有效地提升我们编程的效率,也更有利于降低错误率。了解它们,对以后的工作将带来极大的帮助。

免责声明:文章转载自《C#7.0新特性和语法糖详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Qt 使用openGL 渲染YUV420P格式的视频【CSS】滚动条样式下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Delegate 委托 C#

delegate是C#中的一种类型,它实际上是一个能够持有对某个方法的引用的类。与其它的类不同,delegate类能够拥有一个签名(signature),并且它只能持有与它的签名相匹配的方法的引用。A delegate declaration defines a reference type that can be used to encapsulate...

python基础语法_2基本数据类型

http://www.runoob.com/python3   大纲 Number(数字) String(字符串) List(列表) Tuple(元组) Sets(集合) Dictionarys(字典) python数据类型转换 正文 Number(数字) Python3 支持 int、float、bool、complex(复数)。 在Python...

轻松简单搭建Linux下的C#开发环境<转>

先看看本篇文章最终效果:在 Ubuntu 里跑的开 发环境 MonoDevelop   [图 片:MonoDevelop1.png]如 果平时主要开发控制台类、组件、后端服务等程序,可以尝试在Linux类操作系统下搭建C#.Net开发环境,好处是在Linux环境里你不用担心朋友或 同事拿你的电脑来玩魔兽世界或者一不小心被装了一大堆流氓软件 ;-)1、Lin...

在Linux上运行C#

众所周知,C#是Microsoft推出的.NET语言,只能在.NET平台上运行,例如Win 9x、ME、NT、2000、XP和Win CE之类的操作系统。但是,现在却有了一个叫做Mono的项目,它的目标就是把.NET及其编程语言移植到非Windows的平台上。现在,C#是唯一被移植到非Windows平台的.NET语言。   在任何一个平台(操作系统+硬件体...

[.net]数组

  在C语言中,数组是比较简单,也使用比较多的一种基础的数据结构。常用的有一维数组,二维数组等。但是在C#中,使用最多的是List,Dictionary等一些集合类,因为用他们来操作同类型的数据,比数组更加方便。当然,C#的数组Array也通过实现一些接口,提供了访问和操作数据的一些便捷方法。而在C语言中,都是比较不容易实现或者使用不方便。这也就是C#作为...

CLS(公共语言规范)的CLSCompliant(跨语言调用)

.net的一个很重要的特性就是跨语言的编程,用C#写的dll可以在VB.net里调用,例如:用C#写的一个类,编译到dll中,然后在VB.net中调用: using System;namespace CLSsample{ public class CLSTest {  public CLSTest()  {     }  public void AB...