如何使用 C# 中的 ValueTuple
本文轉(zhuǎn)載自微信公眾號「碼農(nóng)讀書」,作者 碼農(nóng)讀書 。轉(zhuǎn)載本文請聯(lián)系碼農(nóng)讀書公眾號。
Tuple 是一種數(shù)據(jù)結(jié)構(gòu),它由一個有序的、有限的、大小固定的、不可變的異構(gòu)元素的序列組成,當(dāng)我們說 Tuple 中的元素不可變,意味著其中的元素不能進(jìn)行修改。
ValueTuple 是在 C# 7 中被引入,它主要用來解決 Tuple 的兩個問題。
- 解決語義化問題,在之前你只能通過 Item1,Item2, ... 的方式進(jìn)行元素訪問
- 解決性能問題,因為 ValueTuple 是一個輕量級的值類型
這篇文章將會討論 ValueTuple 是什么及如何使用。
ValueTuple 和 Tuple
ValueTuple 是一個輕量級的值類型,并支持強命名,而 Tuple 是一個引用類型,總的來說,ValueTuple 要比 Tuple 擁有更高的性能,Tuple 中的屬性是只讀的,也就是說一旦創(chuàng)建好之后就不能進(jìn)行變更了,而 ValueTuple 的屬性就可以在創(chuàng)建之后進(jìn)行修改。
安裝 System.ValueTuple
一旦使用 Visual Studio 創(chuàng)建好 Console 應(yīng)用程序后,接下來就可以安裝 NuGet 包了,你可以使用 Visual Studio 2019 IDE 進(jìn)行可視化安裝,也可以在 .NET CLI 窗口中使用如下命令。
- dotnet add package System.ValueTuple
請注意現(xiàn)在 ValueTuple 已經(jīng)作為 .NET Framework 4.7 的一個子集存在了。
創(chuàng)建 ValueTuple
有幾種方式可以創(chuàng)建 ValueTuple,大致如下:
- 使用構(gòu)造函數(shù)
- 使用 Create 方法
- 使用 ()
下面的代碼片段展示了如何使用 構(gòu)造函數(shù) 來創(chuàng)建 ValueTuple。
- ValueTuple<int, string, string> valueTuple =new ValueTuple<int, string, string>(1, "Joydip", "Kanjilal");
再來看看如何通過 Create 方法創(chuàng)建 ValueTuple,如下代碼所示:
- var valueTuple = ValueTuple.Create(1, "Joydip", "Kanjilal");
你也可以給成員名賦值相應(yīng)的value來創(chuàng)建一個 ValueTuple,如下代碼所示:
- var author = (Id: 1, FirstName: "Joydip", LastName: "Kanjilal");
除了上面這種方法,還可以將 成員名 + 對應(yīng)值 放置在左邊來實現(xiàn)對 ValueTuple 的創(chuàng)建和初始化,代碼如下:
- (int Id, string FirstName, string LastName) author = (1, "Joydip", "Kanjilal");
ValueTuple 的命名屬性
ValueTuple 支持更加語義化的命名屬性,用來替代默認(rèn)的 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");
- }
使用 解構(gòu)函數(shù)從 ValueTuple 中提取成員
可以使用 解構(gòu)函數(shù) 從 ValueTuple 中提取多個成員,下面的代碼片段展示了如何去實現(xiàn)。
- (int Id, string FirstName, string LastName) = GetAuthor();
修改 ValueTuple 中的值
文章之前也提到了,Tuple 創(chuàng)建好之后就不能對其成員進(jìn)行修改,而 ValueTuple 卻可以,下面的代碼展示了這兩者的區(qū)別。
從上圖中的錯誤信息欄中,可以看出,Tuple 中的 Item 是只讀的,不支持修改。
最后要提的一點是:你可以利用擴展方法實現(xiàn) System.Tuple 和 System.ValueTuple 之間的互轉(zhuǎn),下面的代碼展示了如何將 ValueTuple 轉(zhuǎn)成 Tuple。
- var valueTuple = ValueTuple.Create(1, "Joydip", "Kanjilal");
- var tuple = valueTuple.ToTuple();
ValueTuple 擁有比 Tuple 更簡單的詞法和更高的性能,此外,還可以修改它們的數(shù)據(jù)成員并且還可以給它們賦一些有意義的名字,總之,有太多的理由值得你用 ValueTuple 來代替 Tuple 了。
譯文鏈接:https://www.infoworld.com/article/3528752/how-to-use-valuetuples-in-csharp.html