.NET Framework 4.0之Tuple(元組)

FrankYou發表於2015-07-30

Tuple,是函數語言程式設計的概念之一,早見於Elang、F#等動態語言。Tuple型別像一個口袋,在出門前可以把所需的任何東西一股腦地放在裡面。您可以將鑰匙、駕駛證、便箋簿和鋼筆放在口袋裡,您的口袋是存放各種東西的收集箱。C# 4.0引入的一個新特性 Tuple型別與口袋類似,它可以存放不同型別的物件。

C# 4.0之前我們函式有多個返回值,通常是使用ref,out 。到了c# 4.0 應當使用元組Tuple而不是使用輸出引數,在任何時候都應避免使用ref/out傳遞引數,尤其對引用型別(禁止引用的引用,嘗試改進你的設計。

陣列合並了相同型別的物件,而元組合並了不同型別的物件。元組起源於函式程式語言(如F#) ,在這些語言中頻繁使用元組。.NET 4定義了8個泛型Tuple類和一個靜態Tuple類,它們用作元組的工廠。這裡的不同泛型Tuple類支援不同數量的元素。例如,Tuple<T1>包含-個元素,Tuple<T1,T2>包含兩個元素,以此類推。

為什麼要用Tuple呢?這是個值得權衡的問題,上述MyRequest型別中通過3-Tuple對需要的Request資訊進行封裝,我們當然也可建立一個新的struct來封裝,兩種方式均可勝任。然則,在實際的程式設計實踐中,很多時候我們需要一種靈活的建立一定資料結構的型別,很多時候新的資料結構充當著“臨時”角色,通過大動干戈新型別完全沒有必要,而Tuple既是為此種體驗而設計的。例如:

Point {X, Y},可以表示座標位置的資料結構。
Date {Year, Month, Day},可以表示日期結構;Time {Hour, Minute, Second},可以表示時間結構;而DateTime {Date, Time}則可以實現靈活的日期時間結構。
Request {Name, URL, Result},可以表示Request的若干資訊。
。。。,隨需而取。

優略之間
當前,.NET 4.0預定義的Tuple型別僅有8個,所以我們應考慮對於Tuple提供適度擴充套件的可能, 然而遺憾的是ITuple型別被實現為internal,所以我們無法繼承ITuple,只好自定義類似的實現:

優勢所在:
為方法實現多個返回值體驗,這是顯然的,Tuple元素都可以作為返回值。
靈活的構建資料結構,符合隨要隨到的公僕精神。
強型別。

不足總結:
當前Tuple型別的成員被實現為確定值,目前而言,還沒有動態決議成員數量的機制

一個簡單的例子:

1 public class MyRequest
2 {
3     public Tuple<string, Uri, DateTime> GetMyRequest()
4     {
5         return Tuple.Create<string, Uri, DateTime>("anytao.com", new Uri("http://anytao.net/"), DateTime.Now);
6     }
7 }

 

相關文章