本文转载自微信公众号「码农读书」,作者 码农读书 。转载本文请联系码农读书公众号。
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