如何使用 C# 中的 ValueTuple
本文轉載自微信公眾號「碼農讀書」,作者 碼農讀書 。轉載本文請聯系碼農讀書公眾號。
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