C#7.0中新特性汇总

2019-12-30 13:57:28于丽

Note:这些限制尚未在 Preview 4 中实现。

元组是值类型的,它们的元素是公开的,可变的。他们有值相等,如果所有的元素都是成对相等的(并且具有相同的哈希值),那么这两个元组也是相等的(并且具有相同的哈希值)。

这使得在需要返回多个值的情况下,元组会非常有用。举例来说,如果你需要多个 key 值的字典,使用元组作为你的 key 值,一切会非常顺利。如果你需要在每个位置都具有多个值的列表,使用元组进行列表搜索,会工作的很好。

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

•右键单击 Solution Explorer 中的项目,然后选择“管理的NuGet包......”

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

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

解构

消耗元组的另一种方法是将解构它们。一个解构声明是一个将元组(或其他值)分割成部分并单独分配到新变量的语法:


(string first, string middle, string last) = LookupName(id1); // deconstructing declaration
WriteLine($"found {first} {last}.");

在解构声明中,您可以使用 var 来声明单独的变量:


(var first, var middle, var last) = LookupName(id1); // var inside

或者将一个单独的 var 作为一个缩写放入圆括号外面:


var (first, middle, last) = LookupName(id1); // var outside

你也可以使用解构任务来解构成现有的变量


(first, middle, last) = LookupName(id2); // deconstructing assignment

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


public void Deconstruct(out T1 x1, ..., out Tn xn) { ... }

输出参数构成了解构结果中的值。

(为什么它使用了参数,而不是返回一个元组?这是为了让你针对不同的值拥有多个重载)。


class Point
{
public int X { get; }
public int Y { get; }
public Point(int x, int y) { X = x; Y = y; }
public void Deconstruct(out int x, out int y) { x = X; y = Y; }
}
(var myX, var myY) = GetPoint(); // calls Deconstruct(out myX, out myY);

这是一种常见的模式,以一种对称的方式包含了构建和解构。

对于输出变量,我们计划在解构中加入通配符,来化简你不关心的变量:


(var myX, *) = GetPoint(); // I only care about myX

Note:通配符是否会出现在C#7.0中,这仍是未知数。