简单的说说.Net4.0中的Tuple类型
Microsoft在MSDN中对Tuple的描述是“A tuple is a data structure that has a specific number and sequence of values.”,由于E文水平有限,我理解的大概意思就是:Tuple是具有指定数量和顺序的值的一种数据结构。针对这种数据结构,.Net4.0中提供了一组Tuple类型,具体如下:
Tuple | |
Tuple<T> | |
Tuple<T1, T2> | |
Tuple<T1, T2, T3> | |
Tuple<T1, T2, T3, T4> | |
Tuple<T1, T2, T3, T4, T5> | |
Tuple<T1, T2, T3, T4, T5, T6> | |
Tuple<T1, T2, T3, T4, T5, T6, T7> | |
Tuple<T1, T2, T3, T4, T5, T6, T7, TRest> |
通过这些Tuple类型的声明我们可以看出.Net4.0中提供了从包含1个值到最多8个值的Tuple,我们可以通过第一个Tuple的静态方法Create来创建一个泛型Tuple<>的实例,例如Tuple<string, int> t = Tuple.Create("key", 789); 也可以使用泛型Tuple的构造函数来创建实例,例如Tuple<string, int> t = new Tuple<string, int>("key", 789);对于一个泛型Tuple,我们可以通过它的属性Item1、Item2……Item7和Rest来访问它包含的值。这里要注意Tuple类型的ItemX和Rest属性都是只读的。
知道了Tuple类型的定义后,我们什么时候会用到它呢?对于Tuple<T>来说,我觉得我们大多数时候都不会使用这样一个数据类型将一个实际要用的类型包装起来,然后进行调用。(有些人提到Tuple类型用来和F#等语言进行交互,我不是很了解关于F#的细节,或许是在与F#交互的时候能够用到吧),抛开Tuple<T>不说,其它的Tuple<>类型为我们的程序开发带来了极大的方便。以前当我们需要处理若干相关数据的时候,例如员工ID、员工年龄和员工入职时间,为了编程的结构合理,我们会定义一个新的员工类,让它包含ID、年龄和入职时间等属性(当然,你也可以分别声明3个变量),现在,我们只需要声明一个Tuple<string, int, DateTime>的对象即可,省去了定义一个新类的步骤,当然,我们这么做是以牺牲代码的可读性为代价的,毕竟我们访问Tuple对象的时候是通过类似Item这样的没有实际含义的属性来访问它的成员的。
在MSDN中明确给出了使用Tuple类型的几个方面:
- 用来表示一组单独的数据,比如数据库中的一条记录;这一点很好理解哈,Tuple的每个Item就像一条记录的每个字段。
- 我们可以声明一个Tuple数组,用来提供容易访问和操作的数据集;
- 当我们希望函数返回多个值的时候,我们可以使用Tuple类型作为函数的返回值,这样我们就可以不用ref来定义多个参数了;
- 当我们希望通过一个参数传递多个数值的时候,可以传递一个Tuple类型给函数的参数。例如在多线程编程时调用Thread.Start(Object)时,以前,如果需要传递多个值的时候,我们只能通过声明一个新的类型来实现,现在可以用Tuple了哦。
当我看完MSDN中关于Tuple类型的介绍的时候,产生一些疑问,并对这些疑问进行了思考,下面是我整理出来的这些疑问和我自己的一些看法,供大家参考,如有不准确的地方请多多指教!
- 对于2-Tuple[](Tuple<T1, T2>[])数组来说,它和我们常用的Dictionary<TKey, TValue>有什么区别?从表面上看,它们都可以表示两种数据类型的数据的集合。我个人的看法是Dictionary提供更多的功能用来访问或处理它保存的数据,这从它众多的成员和方法就能看出来,所以当我们只需要进行数据的传递或保存的话,使用2-Tuple会产生更小的系统开销。
- Tuple<>类型和匿名类型(Var)的区别?我认为在一个方法内,它们在使用上没什么区别;但别忘了匿名类型的作用域仅限于方法体内,而Tuple<>作为一种实际的类型,比匿名方法有着更广泛的用途。
- 如果我需要定义的Tuple的成员超过了8个怎么办?期待Microsoft开放更多的成员的Tuple?NO!最简单的方法是我们将Tuple的最后一个成员声明为Tuple类型 :) Tuple<T1, T2, T3, T4, T5, T6, T7, Tuple<T1, T2……>>。但我个人认为如果你需要的成员真的N多,还是定义一个实际的类吧,这样代码的可读性要好的多。很难想象你能记住十几个Item都代表了什么东西,别人看这样的代码也会崩溃吧!!
以上是我对Tuple类型的一些理解,有考虑不周的地方请大家多多指教!!