来源https://www.kenneth-truyers.net/2016/01/20/new-features-in-c-sharp-7/

Tuples##

What###

Tuples是数据的临时分组。区别与struct和class,后两者需要预先定义。

Why###

数据临时分组的最常用场景就是方法的返回值。目前有三种方式。

Out 参数###

public void GetLatLng(string address, out double lat, out double lng) { ... }

double lat, lng;
GetLatLng(myValues, out lat, out lng);
Console.WriteLine($"Lat: {lat}, Long: {lng}");

这种方法的缺点就是不能对async方法使用,还必须提前声明变量,out参数声明时还不能使用var。

Tuple-type####

public Tuple<int, int> GetLatLng(string address) { ... }

var latLng = GetLatLng("some address");
Console.WriteLine($"Lat: {latLng.Item1}, Long: {latLng.Item2}");

这种方式没有Out参数的缺点,但是因为tuple的返回值是item1和item2之类的,含义不清晰。

class/struct####

struct LatLng{ public double Lat; public double Lng;}
public LatLng GetLatLng(string address) { ... } var ll= GetLatLng("some address");
Console.WriteLine($"Lat: {ll.Lat}, Long: {ll.Lng}");

这个缺点就是比较啰嗦和无意义的overhead(如果返回类型仅使用一次的话)

How###

在c#7中有几种不同的方式可以满足这种场景。

Tuple return types####

就是多返回值的情形,如下

public (double lat, double lng) GetLatLng(string address) { ... }

var ll = GetLatLng("some address");
Console.WriteLine($"Lat: {ll.lat}, Long: {ll.lng}");

内联tuples####

可以如下创建tuples

var ll = new (double lat, double lng) { lat = 0, lng = 0 };

tuple解构####

因为将数据捆绑作为概念不是那么重要,所以可能你不想通过捆绑获取数据,而是直接获取。所以你可以直接结构多返回值而不是通过捆绑的tuple(即返回的变量ll)。

(var lat, var lng) = GetLatLng("some address");
Console.WriteLine($"Lat: {lat}, Long: {lng}");

Record类型##

是什么###

Record类型是属性的简单打包,数据类型中只有属性。

为什么###

class和struct仅仅包含属性的情况下,仍然需要一大对声明,相当繁琐。如下

class MyPoint
{
int _x;
int _y;
int _z;
MyPoint(int x, int y, int z){
this._x = x;
this._y = y;
this._z = z;
}
public int X {get{ return this._x;}}
public int Y {get{ return this._y;}}
public int Z {get{ return this._z;}}
}

How###

有了Record类型,你可以一行实现。如下

class Point(int X, int Y, int Z);

而且代码后面替你做了更多事情。

1.类会自动实现IEquatable,这样你可以基于他们的值来比较两个Record类型,而不是引用。

2.ToString方法会输出record中的值。

模式匹配##

是什么###

有了record类型,我们能使用内置的模式匹配。模式匹配意味着你可以在switch语句中根据你所获得数据的类型来执行一个或者其他的语句(也就是跳转到不同分支上)。

为什么###

尽管模式匹配有点像if/else,但是还是有自身的优势的。

1.你可以对任何数据类型做模式匹配,即使自定义类型,而if/else需要基础类型来match

2.模式匹配可以从表达式中抽取值。(意思应该是可以根据表达式的类型来匹配)

How###

模式匹配如下

class Geometry();
class Triangle(int Width, int Height, int Base) : Geometry;
class Rectangle(int Width, int Height) : Geometry;
class Square(int width) : Geometry; Geometry g = new Square(5);
switch (g)
{
case Triangle(int Width, int Height, int Base):
WriteLine($"{Width} {Height} {Base}");
break;
case Rectangle(int Width, int Height):
WriteLine($"{Width} {Height}");
break;
case Square(int Width):
WriteLine($"{Width}");
break;
default:
WriteLine("<other>");
break;
}

如上可以看到如何对数据类型进行模式匹配,以及对其立即解构。

结论##

如上仅仅是即将到了的c#新特性中的三个。

C# 7 新特性-1的更多相关文章

  1. SQL Server 2014 新特性——内存数据库

    SQL Server 2014 新特性——内存数据库 目录 SQL Server 2014 新特性——内存数据库 简介: 设计目的和原因: 专业名词 In-Memory OLTP不同之处 内存优化表 ...

  2. ElasticSearch 5学习(10)——结构化查询(包括新特性)

    之前我们所有的查询都属于命令行查询,但是不利于复杂的查询,而且一般在项目开发中不使用命令行查询方式,只有在调试测试时使用简单命令行查询,但是,如果想要善用搜索,我们必须使用请求体查询(request ...

  3. [干货来袭]C#6.0新特性

    微软昨天发布了新的VS 2015 ..随之而来的还有很多很多东西... .NET新版本 ASP.NET新版本...等等..太多..实在没消化.. 分享一下也是昨天发布的新的C#6.0的部分新特性吧.. ...

  4. CSS3新特性应用之结构与布局

    一.自适应内部元素 利用width的新特性min-content实现 width新特性值介绍: fill-available,自动填充盒子模型中剩余的宽度,包含margin.padding.borde ...

  5. 【译】Meteor 新手教程:在排行榜上添加新特性

    原文:http://danneu.com/posts/6-meteor-tutorial-for-fellow-noobs-adding-features-to-the-leaderboard-dem ...

  6. 跨平台的 .NET 运行环境 Mono 3.2 新特性

    Mono 3.2 发布了,对 Mono 3.0 和 2.10 版本的支持不再继续,而且这两个分支也不再提供 bug 修复更新. Mono 3.2 主要新特性: LLVM 更新到 3.2 版本,带来更多 ...

  7. Atitit opencv版本新特性attilax总结

    Atitit opencv版本新特性attilax总结 1.1. :OpenCV 3.0 发布,史上功能最全,速度最快的版1 1.2. 应用领域2 1.3. OPENCV2.4.3改进 2.4.2就有 ...

  8. es6 新特性2

    es6其他几个非常有用的新特性. import export 这两个家伙对应的就是es6自己的module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成 ...

  9. ES6 新特性

    ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015. 也就是说,ES6就是ES2015. ...

  10. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》

    一.本文所涉及的内容(Contents) 本文所涉及的内容(Contents) 背景(Contexts) 撰写经历(Experience) 特约稿正文(Content-body) 第一部分:生活中资源 ...

随机推荐

  1. [BZOJ3261&BZOJ3166]可持久化trie树及其应用

    可持久化trie树 可持久化trie树现在想来是比较好理解的了,但却看了一个下午... 相当于对于每个状态建立一条链(或者说一棵trie),求解的时候只要让两个点按照相同的步子走然后看sum的大小关系 ...

  2. 如何开启SUSE Linux的SSH

    1. 使用命令行停止防火墙 /etc/init.d/SuSEfirewall2_init stop /etc/init.d/SuSEfirewall2_setup stop 2. 修改 vi /etc ...

  3. TASK_KILLABLE:Linux 中的新进程状态【转】

    转自:https://www.ibm.com/developerworks/cn/linux/l-task-killable/index.html 新的睡眠状态允许 TASK_UNINTERRUPTI ...

  4. kuangbin 带你飞 数学基础

    模版整理: 晒素数 void init() { cas = ; ; i < MAXD ; i++) is_prime[i] = true; is_prime[] = is_prime[] = f ...

  5. 记录一次lnmp故障报告

    业务架构图: nginx 状态监控图: 本次故障的表现为:前端php页面无法打开,空白页或者502错误. nginx中php配置如下: location ~ \.php$ { root /xxx/xx ...

  6. js面向对象编程(二)构造函数的继承(转载)

    Javascript面向对象编程(二):构造函数的继承 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继 ...

  7. SSH Secure Shell 无法登录:server responded "algorithm negotiation failed”

    SSH Secure Shell Client 连接 ubuntu系统报错 修改ssh的配置文件 /etc/ssh/sshd_config在配置文件中添加: Ciphers aes128-cbc,ae ...

  8. 《锋利的JQuery》读书要点笔记5——jQuery与Ajax的应用

    第6章 jQuery与Ajax的应用 Ajax的全称:Asynchronous JavaScript and XML (异步Javascript和XML) 传统模式中,数据提交通过表单方式实现,数据的 ...

  9. matlab保存图片成eps格式不全,导致latex中图片显示不全的问题

    我们经常会遇到这样的问题.用将matlab生成的图保存EPS格式后,用GSVIEW打开后,可以看到图片显示不全.遇到这种情况是,我们可以使用dvipdf——dvips的方法来生成PDF,这样生成的pd ...

  10. 实例解析嵌套的JSON格式数据

    关于JSON数据格式的基本知识和概念,参看: http://www.cnblogs.com/zouzf/archive/2012/03/31/2426646.html <span style=& ...