转自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新特性和语法糖详解的更多相关文章

  1. Java 语法糖详解

    语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法. 这种语法对语言的功能并没有影响,但是 ...

  2. Java语法糖详解

    语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更 ...

  3. 2020你还不会Java8新特性?方法引用详解及Stream 流介绍和操作方式详解(三)

    方法引用详解 方法引用: method reference 方法引用实际上是Lambda表达式的一种语法糖 我们可以将方法引用看作是一个「函数指针」,function pointer 方法引用共分为4 ...

  4. 【repost】H5的新特性及部分API详解

    h5新特性总览 移除的元素 纯表现的元素: basefont.big.center.font等 对可用性产生负面影响的元素: frame.frameset.noframes 新增的API 语义: 能够 ...

  5. iOS10新特性之CallKit开发详解:锁屏接听和来电识别

    国庆节过完了,回家好好休息一天,今天好好分享一下CallKit开发.最近发现好多吃瓜问CallKit的VoIP开发适配,对iOS10的新特性开发和适配也在上个月完成,接下来就分享一下VoIP应用如何使 ...

  6. using语法糖详解 2015-01-06 17:45 50人阅读 评论(0) 收藏

    前段事件在using外套try catch 突然想到,如果出现异常 会不会执行释放,不执行的话那服务器很可能导致崩溃... 特意上了CSDN问了大神..得到了答案.. Using相等于try catc ...

  7. C++11中新特性之:initializer_list详解

    C++11提供的新类型,定义在<initializer_list>头文件中. template< class T > class initializer_list; 先说它的用 ...

  8. C# 7.0 新特性1: 基于Tuple的“多”返回值方法

    本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...

  9. C# 7.0 新特性3: 模式匹配

    本文参考Roslyn项目Issue:#206,及Docs:#patterns. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# ...

随机推荐

  1. JS中For循环中嵌套setTimeout()方法的执行顺序

    在For循环中执行setTimeOut()方法的代码,执行顺序是怎样的呢? 代码如下 function time() { for(var i= 0;i<5;i++){ setTimeout(fu ...

  2. vue中获取滚动table的可视页面宽度,调整表头与列对齐(每列宽度不都相同)

    mounted() { // 在mounted中监听表格scroll事件 this.$refs.scrollTable.addEventListener( 'scroll',(event) => ...

  3. vue图片不存在时加载默认图片

    在文件中的img那里添加:οnerrοr="errorImg01",然后设置errorImg01的路径如果直接写成 errorImg01: ('../../assets/image ...

  4. 通过runtime对类别进行属性的扩展

    category使用  objc_setAssociatedObject/objc_getAssociatedObject 实现添加属性 属性 其实就是 get/set 方法. 我们可以使用 objc ...

  5. ids

    https://www.cnblogs.com/wyt007/p/8309377.html

  6. Composer\Downloader\TransportException ... Failed to enable crypto,failed to open stream: operation failed

    failed to open stream: operation failed 错误详细信息: [Composer\Downloader\TransportException] The "h ...

  7. angular,,以及深度拷贝问题;JSON.parse,JSON.stringify灵活运用

    问题: $scope.list = [];$scope.listTree = {};$scope.dataTree = []; //获取listTree的数据$scope.getList = func ...

  8. <authentication> 元素

    <authentication> 元素 配置 ASP.NET 身份验证支持.该元素只能在计算机.站点或应用程序级别声明.如果试图在配置文件中的子目录或页级别上进行声明,则将产生分析器错误信 ...

  9. CSS3边框 阴影 box-shadow

    box-shadow是向盒子添加阴影.支持添加一个或者多个. box-shadow: X轴偏移量 Y轴偏移量 [阴影模糊半径] [阴影扩展半径] [阴影颜色] [投影方式]; 参数介绍: box-sh ...

  10. 阅读《Effective Java》每条tips的理解和总结(1)

    <Effective Java>这本书的结构是90来条tips,有长有短,每条tip都值的学习.这里根据对书中每条tip的理解做简短的总结,方便日后回顾.持续更新~ 1. 考虑用静态方法代 ...