C# 7.0新功能

下面是对C#7.0 版本所有语言功能的描述。随着 Visual Studio “15” preview 4 的发布,大部分功能可以被更灵活的应用。现在正是时候将这些功能介绍给大家,你也可以借此让我们知道你的想法。

  C#7.0 增加了很多新的功能,更专注于数据的消费,代码的简化及代码的性能。或许最大的功能就是元组和模式匹配,它可以快速获得多个返回结果,而模式匹配,它可以根据数据的“形”的不同来简化代码。我们希望将它们结合起来,从而使你的代码更加简洁高效,也可以使你更加快乐并富有成效。您可以点击 Visual studio 窗口顶部的“send feedback”按钮来告诉我们是否有哪些功能没有达到预期的功效,也可以告诉我们您对功能进一步改善的一些看法。还有许多功能没有在 Preview 4 中实现。我们计划在最终版本发布下面所描述的功能,如果我们不能及时发布这些功能,会在 notes 上通知大家的。如果这些功能有变化,我们也会通知大家的。最终可能会有一些功能的改变和删除。

  如果你对这些功能的设计过程感兴趣,你可以在 Roslyn GitHub site 上查看我们的设计笔记和讨论。

  希望你对C#7.0 有一个愉快的体验。

  输出变量:

  在当前的 C# 版本,使用 out 参数可能不像我们想的那样方便。在你调用一个带有 out 参数的方法之前,你必须首先声明一个变量并传递给它。你通常不会初始化这些变量(毕竟它们会被方法重写),也不能用 var 去声明他们,而是必须指定数据的完整类型。

  在C#7.0 版本中,我们添加了 out 变量,可以在给一个函数传入参数的时候再去定义变量的能力。

  变量的作用域是一个封闭的块,因此后续的代码行也可以使用它们。大多数类型的语句都没有它们自己的作用域,因此被声明的 out 参数通常被引入到封闭的范围内。

  注:在 Preview 4 中,适用范围规则有了更多的限制:out 参数的作用域是声明它的语句。因此,上面那个例子只有在下一次发布的时候才能真正使用。

  因为 out 变量会直接被当做 out 参数来声明,这样编译器通常会告诉他们应该是的类型(除非它们被重载),所以我们可以用 VAR 来定义,而不必使用真正的类型。

  Out 参数的一种常见用法是 Try…模式, 其中一个布尔返回值表示成功,out 参数会携带所获得的结果:

  注:这里的i仅仅在 if 分支中会用到,所以 Preview 4 可以很好的处理这种情况。

  我们还可以使用通配作为 out 参数,用*的形式来处理,这样你就可以不必关注你不想关注的返回值了。

  注:我们还不确定在C# 7.0 是否可以使用通配符。

  模式匹配

  C# 7.0 引入了模式的概念,抽象的讲,模式是语法元素,能用来测试一个数据是否具有某种“形”,并且在它被使用的时候从中提取信息。

  C# 7.0 中的模式示例:

  • C形式的常量模式(C是 C# 中的常量表达式),我们可以验证输入是否等于C

  • TX 形式的类型模式(T是一种类型,X 是一个标识符)。

  • Var x 形式的 Var 模式 (x是一个标识符)。

  这仅仅是一个开始,模式是 C# 中的一个新语言元素,我们希望未来在 C# 中会有更多类型的模式。

  在C# 7.0 中,我们改进了两种已经存在的模式语法设计:

  • is 表达式的右值也可以是模式,而不仅仅只能是一种类型。

  • switch 中的 case 分支,也可以匹配模式,而不仅仅是常量了。

  在未来,我们会增加更多模式的使用。

  使用模式 IS 的表达式

  下面是一个使用 Is 表达式的例子,用到了常量模式和类型模式。

  正如你所看到的,模式变量(模式引入的变量)很像之前说过的输出变量,可以在表达式中声明,并且在最近的定义域中使用。就像输出变量一样,模式变量是可变的。

  注:像输出变量(out variables)一样,我们会在 Preview 4 给出更加严谨的规则。

  模式和 Try 方法一起用也是可以的。

  带模式的 Switch 语句

  我们正在归纳总结这些 switch 语句,因此:

  • 你可以在任何类型上使用 switch(不仅仅是原始类型)

  • 可以在 case 子句中使用模式

  • Case 子句可以拥有额外的条件

  下面是一个例子

  关于新扩展的 switch 语句,有几点需要注意:

  • Case 子句的顺序现在很重要:就像 catch 子句,case 子句不再是必然不相交的,第一个子句匹配的将被选择。

  • 默认子句总是最后被判断:即使上面代码中 null 子句是最后才来,它会在默认子句被选择前被检查。这是为了与现有 switch 语义相兼容。然而,好的做法通常会让你把默认子句放到最后。

  • Switch 不会到最后的 null 语句:这是因为当前 IS 表达式的例子具有类型匹配,不会匹配到 null。 这保证了空值不会不小心被任何的类型模式匹配上的情况; 你必须更明确如何处理它们(或放弃它而使用默认语句)。

  元组

  这是一个从方法中返回多个值的常见模式。目前可用的选项并不是最理想的:

  输出参数。使用笨拙(即便有上面描述到的改进),它们在使用异步方法时不起作用。

  • System.Tuple<…>返回类型。使用繁琐并且需要分配一个元组对象。

  • 方法的定制传输类型:对于类型,具有大量的代码开销,其目的仅是暂时将一些值组合起来。

  • 通过动态返回类型返回匿名类型。高的性能开销,而且没有静态类型检查。

  为了在这方面做得更好,C# 7.0 添加了元组类型和元组文字:

  这个方法可以有效地返回三个字符串,将其作为元素包含在一个元组值里。

  方法的调用者将会接收到一个元组,并且可以单独地访问其中的元素:

  Item1 等是元组元素的默认名,并能够一直使用。但它们不具有描述性,因此你可以选择添加更好的。

  现在元组的接收者有多个具有描述性的名称可用:

  你也可以在元组文字中直接指定元素名称:

  通常来说,你可以给元组类型分配相互无关的名字,只要独立的元素是可以被分配的,元组类型会自如转换成其他元组类型。但是也存在一些限制,特别是对于元组文字,会在常见的错误情况下警告或提示,例如偶然交换元素的名字。

  注:这些限制还没在 Preview 4 中实现 。

  元组是值类型,而且他们的元素是公开的、可变的。两个元组相等(并且有相同的哈希值),意味着它们的元素都是成对匹配的(并且有相同的哈希值)。

  这使得元组对于在需要多个返回值的情况下非常有用。举例来说,如果你需要一个有多种键的词典,使用元组作为你的键,一切会非常顺利。如果你需要在每个位置有多种值的列表,使用元组进行列表搜索,程序会正常运行。

  注:元组依赖于一组基本类型,它们还没包括在 Preview 4 中。为了使该特性工作,你可以通过 NuGget 获取它们:

  • 在 Solution Explorer 中右键点击项目,并选择“管理 NuGet 包…”

  • 选择“Browse”选项卡,选中“Include prerelease” ,选择“nuget.org”作为“Package source”

  • 搜索“System.ValueTuple”并安装它

  Deconstruction 解构

  消耗元组的另一种方法是解构元组。解构声明是一种将元组拆分,并单独分配到新变量的语法:

  在解构中可采用 var 关键字来声明单独的变量:

  或者把 var 关键字提取出来放在括号外:

  你也可以通过解构赋值来解构成一个现有变量:

  解构不仅仅适用于元组。任何类型都可以被解构,只要它有一个对应的(实例或扩展)解构方法:

  输出参数由结构产生的值构成。
(为何它使用了参数,而不是返回一个元组?这是为了让你可以针对不同的值拥有多个重载)。

  构造函数和解构函数以对称方式出现是一种常见的模式。
至于输出变量,我们计划在解构中使用“通配符”,来化简你不关心的那些变量:

  注:现在仍然不能确定通配符是否会出现在C#7.0 中。

  局部函数

  有时,一个辅助函数只在一个使用它的单一方法的内部有意义。现在你可以在其他功能体内部以一个局部函数来声明这样的函数:

  闭合范围内的参数和局部变量在局部函数内是可用的,就像他们在 lambda 表达式中一样。
举个例子,迭代的方法实现通常需要一个非迭代的封装方法,以便在调用时检查实参。(迭代器本身不能启动,直到调用 MoveNext 才会运行)。局部函数非常适合这样的场景:

  如果 Iterator 是紧随 Filter 的一个私有方法,它将有可能被其他成员不小心使用(不需要参数检查)。此外,它将采取所有跟 Filter 里相同的参数,而不是指定域内的参数。

  注:在 Preview 4 版本中,局部函数必须在它们被调用之前声明。这个限制将被放松,能调用读取直接赋值的局部变量。

  文字改进

  C#7.0 允许用”_”作为数字分隔符:

  你可以把它们放在任意的数字之间,以提高可读性。这对数值没有影响。
另外,C # 7 引进了二进制数,因此,您可以直接指定二进制模式,而不需要知道十六进制符号。

  引用返回和局部引用

  就像在C#中你可以通过引用(用 ref 修饰符)传递参数,你现在也可以通过引用来返回参数,并通过引用将它们存储在局部变量中。

  这个是非常有用的。例如,一个游戏可能会将它的数据保存在一个大的预分配数组结构中(为避免垃圾回收机制暂停)。这个方法可以直接返回一个引用到这样一个结构,且通过调用者可以读取和修改它。

  为确保安全,也有以下一些限制:

  • 你只能返回”安全返回”的引用:一个是传递给你的引用,一个是指向对象中的引用

  • 本地引用会被初始化成一个本地存储,并且不能指向另一个存储

  异步返回类型

  到目前为止,在C#的异步方法必须返回 void,Task 或 Task<T>。C#7.0 允许以这样的方式来定义其它类型,从而使它们可以从异步方法返回。

  例如,我们计划建立一个 ValueTask<T>结构类型的数据。建立它是为了防止 Task<T> 对象的分配时,异步操作的结果在等候是已可用。对于很多异步场景,比如以涉及缓冲为例,这可以大大减少分配的数量,并使性能有显著提升。

  注:异步返回类型尚未在 Preivew4 中提供。

  更多 Expression-bodied 成员

  Expression-bodied 的方法、属性等都是C# 6.0 的重大突破,但是不是所有的成员都可以使用的。 C#7.0 添加了访问器、构造函数和终结器等,使更多成员可以使用 Expression-bodied 方法:

  注:这些额外的 Expression-bodied 成员尚未在 Preview4 中提供。

  这是一个由社区共享的示例,而非微软 C# 团队提供的,它是开源的!

  Throw 表达式

  在表达式中间抛出一个异常是很容易的:只要调用一个方法!但在 C # 7.0 中,我们允许在一些地方直接抛出一个表达式:

  注:Throw 表达式尚未在 Preview 4 中提供。

原文地址:https://news.cnblogs.com/n/561619/


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/327056.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MybatisPlus学习(四)条件构造器Wrapper方法详解

https://www.cnblogs.com/xianz666/p/13857733.html MybatisPlus学习&#xff08;四&#xff09;条件构造器Wrapper方法详解 文章目录 1、条件构造器2、QueryWrapper 2.1、eq、ne2.2、gt、ge、lt、le2.3、between、notBetween2.4、like、notLike、likeLeft、likeRight2.4、isN…

使用ueditor实现多图片上传案例

UEditor是由百度WEB前端研发部开发的所见即所得的开源富文本编辑器&#xff0c;具有轻量、可定制、用户体验优秀等特点。开源基于BSD协议&#xff0c;所有源代码在协议允许范围内可自由修改和使用。百度UEditor的推出&#xff0c;可以帮助不少网站开发者在开发富文本编辑器所遇…

自定义ClassLoader和双亲委派机制

转载自 自定义ClassLoader和双亲委派机制 ClassLoader ClassLoad&#xff1a;类加载器&#xff08;class loader&#xff09;用来加载 Java 类到 Java 虚拟机中。Java 源程序&#xff08;.java 文件&#xff09;在经过 Java 编译器编译之后就被转换成 Java 字节代码&#xff0…

ASP.NET Core 1.0 开发记录

ASP.NET Core 1.0 更新比较快&#xff08;可能后面更新就不大了&#xff09;&#xff0c;阅读注意时间节点&#xff0c;这篇博文主要记录用 ASP.NET Core 1.0 开发简单应用项目的一些记录&#xff0c;以备查阅。 ASP.NET Core 1.0 相关 Nuget 程序包源&#xff1a;https://api.…

volatile 关键字

volatile是干啥用的&#xff0c;有什么含义和特点呢&#xff1f; 当一个共享变量被volatile修饰时&#xff0c;它就具备了“可见性”&#xff0c;即这个变量被一个线程修改时&#xff0c;这个改变会立即被其他线程知道。当一个共享变量被volatile修饰时&#xff0c;会禁止“指…

使用ueditor实现多图片上传案例——实体类(Shopping.java)

/** * Title: Shopping.java * Package org.entity * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-9-30 下午9:37:33 * version V1.0 */ package org.entity;/** * * 项目名称&#xff1a;test_fuwenben * 类…

深入浅出ClassLoader

转载自 深入浅出ClassLoader 你真的了解ClassLoader吗&#xff1f; 这篇文章翻译自zeroturnaround.com的 Do You Really Get Classloaders? &#xff0c;融入和补充了笔者的一些实践、经验和样例。本文的例子比原文更加具有实际意义&#xff0c;文字内容也更充沛一些&#xf…

三种获取Class类型的实例的方法

通过Object类中的getClass()方法&#xff1b;通过静态方法Class.forName("全类名")&#xff1b;通过类字面常量Class.class。 三种获取Class类型的实例的方法 方法1&#xff1a;通过Object类中的getClass()方法返回一个Class类型的实例 示例如下&#xff1a; Per…

使用ueditor实现多图片上传案例——Dao层(BaseDao)

package org.dao;import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List;/*** * * 项目名称&#xff1a;test_face_photo * 类名称&#…

微软任命LinkedIn高级副总裁为首席技术官

Kevin Scott曾是LinkedIn工程方面的高级VP&#xff0c;被任命为微软CTO后&#xff0c;Scott将全面统筹微软战略规划&#xff0c;以主动的姿态推进公司间合作&#xff0c;以最大化微软在伙伴及客户间的影响力。据了解&#xff0c;该职位为新创职位&#xff0c;为微软公司级CTO&a…

四种常见的 POST 提交数据方式对应的content-type取值

做前后端分离一般都有第3中 &#xff0c; 第一种 基本上jquery那年代用的了 第2种在需要传文件时用的 https://www.cnblogs.com/wushifeng/p/6707248.html 四种常见的 POST 提交数据方式对应的content-type取值 application/x-www-form-urlencoded 这应该是最常见的 POST 提…

jQuery 基础教程 (三)之jQuery的选择器

一、jQuery 选择器 &#xff08;1&#xff09;选择器是 jQuery 的根基, 在 jQuery 中, 对事件处理, 遍历 DOM 和 Ajax 操作都依赖于选择器 &#xff08;2&#xff09;jQuery 选择器的优点: 简洁的写法 $(#id) //documnet.getElementById(id); $(p) //documnet.getEl…

用rollback()VS不用rollback()

不用rollback()表面和用了rollback()效果一样&#xff0c;但是不用rollback()可能导致被锁住的数据不能及时的释放&#xff08;需要等事物超时释放&#xff09;,会影响下一次的事物操作

使用ueditor实现多图片上传案例——Dao层(IBaseDaoUtil)

/*** */ package org.dao;/*** * * 项目名称&#xff1a;test_face_photo * 类名称&#xff1a;IBaseDaoUtil * 类描述&#xff1a; 共用接口 * 创建人&#xff1a;Mu Xiongxiong * 创建时间&#xff1a;2017-9-22 下午6:59:36 * 修改人&#xff1a;Mu Xiong…

update字段变更SpringBoot @JsonProperty的使用属性的名称序列化为另外一个名称

https://blog.csdn.net/wtb617806038/article/details/86093301 Restful 接口调用Json接收相关问题 1、背景&#xff1a; 在项目上使用SpringBoot为框架&#xff0c;调用第三方接口时&#xff0c;返回的参数类型&#xff0c;不符合标准的命名规则&#xff0c;需要进行处理&am…

SQL Server 2014内存优化表的使用场景

最近一个朋友找到走起君&#xff0c;咨询走起君内存优化表如何做高可用的问题 大家知道&#xff0c;内存优化表是从SQL Server 2014开始引入&#xff0c;可能大家对内存优化表还是比较陌生&#xff0c;网上也鲜有内存优化表使用场景的文章 朋友公司做的业务是跟蜂鸟配送类似的配…

jQuery 基础教程 (二)之jQuery对象与DOM对象

一、jQuery 对象 &#xff08;1&#xff09;jQuery 对象就是通过 jQuery 包装DOM对象后产生的对象 &#xff08;2&#xff09;Query 对象是 jQuery 独有的. 如果一个对象是 jQuery 对象, 那么它就可以使用 jQuery 里的方法: $(“#tab”).html(); &#xff08;3&#xff09;j…

使用ueditor实现多图片上传案例——Dao层(IShoppingDao)

/** * Title: IShoppingDao.java * Package org.dao * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_gmail_com * date 2017-9-30 下午9:57:35 * version V1.0 */ package org.dao;import org.entity.Shopping;/** * * 项目名称&#x…

String转Double

String转Double String.format("%.1f",Double.parseDouble(r.getString(5)))