

如何使用 C# 中的 ValueTuple
source link: https://mp.weixin.qq.com/s?__biz=MzU4Mjc4NzgyOQ%3D%3D&%3Bmid=2247488257&%3Bidx=1&%3Bsn=3e2ff60c404f016326b3277aaf7193e0
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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
往期 精彩 回顾
.NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
【.NET Core微服务实战-统一身份认证】开篇及目录索引
Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南)
.NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了
用abp vNext快速开发Quartz.NET定时任务管理界面
Recommend
-
185
当时写这篇文章的时候才接触 mac 没多久,使用快两年之后,再次修订了本文。 0x00 前言谈及 macOS , 很多人喜欢和 Win 比个高下。在我看来, Win 虽在非编程类生态和易用性比 Mac 要好很多,可专业人士之所以专业是因为他能挑选适合的武器发挥
-
118
在写 essay 时,如何避免使用过多的「I」?1,595205,326
-
124
机器之心翻译2017/12/16 11:06如何使用TensorFlow实现音频分类任务
-
144
在Andoid中如何使用RxJava 2进行多线程编程?
-
96
website upgrading… 京ICP备1100...
-
31
为什么有此文章 首先要说的是我们公司内部技术框架是用 abp.vnext 框架整合而来的,我们架构师对于 abp 相关的知识都很了然于胸了。并且这个框架的确很优秀,省了我们前期大量基础工作。架构师把主要的架子搭建好了之后,把应用...
-
29
发布于 2020-05-24 16:21更新于 2020-05-24 08:27 不知你是否好奇,System.ValueTuple 是新框架(.NET Core 3.0)开始引入的类型,但可以通过 NuGet 包向旧框架提供这些类型的使用。并且,这些包即便安装到本来就有此类型的新框...
-
4
一:背景 1. 讲故事 前几天在写一个api接口,需要对衣物表进行分页查询,查询的output需要返回两个信息,一个是 totalCount,一个是 clothesList,在以前我可能需要封装一个 PagedClothes 类,如下代码: p...
-
8
C# 7 ValueTuple-黑暗執行緒 【本系列是我的 C# in Depth 第四版讀書筆記,背景故事在這裡】 Tuple 從 C# 4 開始就有,可用 new Tuple<int...
-
3
C# ValueTuple
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK