Tuple 是一种数据结构,它由一个有序的、有限的、大小固定的、不可变的异构元素的序列组成,当我们说 Tuple 中的元素不可变,意味着其中的元素不能进行修改。
ValueTuple 是在 C# 7 中被引入,它主要用来解决 Tuple 的两个问题。
解决语义化问题,在之前你只能通过
Item1,Item2, ...
的方式进行元素访问解决性能问题,因为 ValueTuple 是一个轻量级的值类型
这篇文章将会讨论 ValueTuple 是什么及如何使用。
ValueTuple 和 Tuple
ValueTuple 是一个轻量级的值类型,并支持强命名,而 Tuple 是一个引用类型,总的来说,ValueTuple 要比 Tuple 拥有更高的性能,Tuple 中的属性是只读的,也就是说一旦创建好之后就不能进行变更了,而 ValueTuple 的属性就可以在创建之后进行修改。
安装 System.ValueTuple
一旦使用 Visual Studio 创建好 Console 应用程序后,接下来就可以安装 NuGet 包了,你可以使用 Visual Studio 2019 IDE
进行可视化安装,也可以在 .NET CLI 窗口中使用如下命令。
dotnet add package System.ValueTuple
请注意现在 ValueTuple 已经作为 .NET Framework 4.7 的一个子集存在了。
创建 ValueTuple
有几种方式可以创建 ValueTuple,大致如下:
使用构造函数
使用 Create 方法
使用 ()
下面的代码片段展示了如何使用 构造函数
来创建 ValueTuple。
ValueTuple<int, string, string> valueTuple =new ValueTuple<int, string, string>(1, "Joydip", "Kanjilal");
再来看看如何通过 Create 方法创建 ValueTuple,如下代码所示:
var valueTuple = ValueTuple.Create(1, "Joydip", "Kanjilal");
你也可以给成员名赋值相应的value来创建一个 ValueTuple,如下代码所示:
var author = (Id: 1, FirstName: "Joydip", LastName: "Kanjilal");
除了上面这种方法,还可以将 成员名 + 对应值
放置在左边来实现对 ValueTuple 的创建和初始化,代码如下:
(int Id, string FirstName, string LastName) author = (1, "Joydip", "Kanjilal");
ValueTuple 的命名属性
ValueTuple 支持更加语义化的命名属性,用来替代默认的 Item1,Item2,Item3 ... 下面的代码展示了如何给 ValueTuple 的属性分配名字。
(int Id, string FirstName, string LastName) author = (1, "Joydip", "Kanjilal");
从方法中返回 ValueTuple
和 Tuple 一样,也可以使用 ValueTuple 从方法中返回多个值,下面的代码片段展示了如何从方法中返回 ValueTuple。
static (int, string, string) GetAuthor()
{return (Id: 1, FirstName: "Joydip", LastName: "Kanjilal");
}
使用 解构函数从 ValueTuple 中提取成员
可以使用 解构函数
从 ValueTuple 中提取多个成员,下面的代码片段展示了如何去实现。
(int Id, string FirstName, string LastName) = GetAuthor();
修改 ValueTuple 中的值
文章之前也提到了,Tuple 创建好之后就不能对其成员进行修改,而 ValueTuple 却可以,下面的代码展示了这两者的区别。
从上图中的错误信息栏中,可以看出,Tuple 中的 Item 是只读的,不支持修改。
最后要提的一点是:你可以利用扩展方法实现 System.Tuple
和 System.ValueTuple
之间的互转,下面的代码展示了如何将 ValueTuple 转成 Tuple。
var valueTuple = ValueTuple.Create(1, "Joydip", "Kanjilal");
var tuple = valueTuple.ToTuple();
ValueTuple 拥有比 Tuple 更简单的词法和更高的性能,此外,还可以修改它们的数据成员并且还可以给它们赋一些有意义的名字,总之,有太多的理由值得你用 ValueTuple 来代替 Tuple 了。
译文链接:https://www.infoworld.com/article/3528752/how-to-use-valuetuples-in-csharp.html