如何使用 C# 中的 ValueTuple

DotNetCore实战

共 2550字,需浏览 6分钟

 ·

2021-01-20 02:18


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<intstringstring> valueTuple =new ValueTuple<intstringstring>(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 (intstringstring) 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


往期精彩回顾




【推荐】.NET Core开发实战视频课程 ★★★

.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划

【.NET Core微服务实战-统一身份认证】开篇及目录索引

Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)

.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

10个小技巧助您写出高性能的ASP.NET Core代码

用abp vNext快速开发Quartz.NET定时任务管理界面

在ASP.NET Core中创建基于Quartz.NET托管服务轻松实现作业调度

现身说法:实际业务出发分析百亿数据量下的多表查询优化

关于C#异步编程你应该了解的几点建议

C#异步编程看这篇就够了


浏览 37
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报