C# 泛型
-------------------------------------------------------------------------------------------
我在msdn上看到泛型类List,说是要取代arraylist,但是我看到它举例的首先你要实例化这个类,List,并且指定这个类是什么类型,比如
List<string> dinosaurs = new List<string>();
dinosaurs.Add("Tyrannosaurus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Mamenchisaurus");
dinosaurs.Add("Deinonychus");
dinosaurs.Add("Compsognathus");
但是这样的话就没有arraylist那样灵活,即使你实例化了arraylist,也可以加入其它的值类型等。那么List类集合只有容纳一系列类型必须完全一致的类,是吗?那功能上要大打折扣啊,又没有高手对此提出疑义啊?
--------------------------------------------------------------------------------------------
************************************************************************
--------------------------------------------------------------------------------------------
1 楼yyw84(乱码人生)回复于 2006-04-11
MSDN已经回答了你的问题,List的出生并不是用来取代ArrayList的
-----------------------
在决定使用 List 还是使用 ArrayList 类(两者具有类似的功能)时,记住 List 类在大多数情况下执行得更好并且是类型安全的。如果对 List 类的类型 T 使用引用类型,则两个类的行为是完全相同的。但是,如果对类型 T 使用值类型,则需要考虑实现和装箱问题。
如果对类型 T 使用值类型,则编译器将特别针对该值类型生成 List 类的实现。这意味着不必对 List 对象的列表元素进行装箱就可以使用该元素,并且在创建大约 500 个列表元素之后,不对列表元素装箱所节省的内存将大于生成该类实现所使用的内存。
确保用于类型 T 的值类型实现 IEquatable 泛型接口。如果未实现,则诸如 Contains 这样的方法必须调用 Object.Equals(Object) 方法,后者对受影响的列表元素进行装箱。如果值类型实现 IComparable 接口,并且您拥有源代码,则还应实现 IComparable 泛型接口以防止 BinarySearch 和 Sort 方法对列表元素进行装箱。如果您不拥有源代码,则将一个 IComparer 对象传递给 BinarySearch 和 Sort 方法。
使用 List 类的特定于类型的实现,而不是使用 ArrayList 类或自己编写强类型包装集合,这样是很有好处的。原因是您的实现必须做 .NET Framework 已经为您完成的工作,并且公共语言运行库能够共享 Microsoft 中间语言代码和元素据,这是您的实现所无法做到的。
--------------------------------------------------------------------------------------------
************************************************************************
--------------------------------------------------------------------------------------------
2 楼xxqq0824(赛跑)回复于 2006-04-12 09:47:47 得分 0
大哥,我就是这段话看不大明白啊。。。。那用List的时候只能加入同一种类型的数据是吗?
--------------------------------------------------------------------------------------------
************************************************************************
--------------------------------------------------------------------------------------------
3 楼qlwuu(沉睡火山)回复于 2006-04-12 10:32:19 得分 0
已经说得很清楚了,在值类型的场合用List不必box, 效率会更高。而且这样来使用List本来就是强类型的场合,不会加入其他类型。如果指定了类型T,其他类型是加不进去的,你试试就知道,别用string,string会自动转换。
--------------------------------------------------------------------------------------------
************************************************************************
--------------------------------------------------------------------------------------------
4 楼xxqq0824(赛跑)回复于 2006-04-12 11:00:05 得分 0
那就是说List不能既加入string,又加入int,那和arraylist的功能相差还是挺远的了
--------------------------------------------------------------------------------------------
************************************************************************
--------------------------------------------------------------------------------------------
5 楼yyw84(乱码人生)回复于 2006-04-12 11:41:57 得分 0
那就是说List不能既加入string,又加入int,那和arraylist的功能相差还是挺远的了
-------------
这样不是可以起到一个数据类型的约束,避免了不正确插入数据,而且它是在编程时检查的,不至于等到运行时才抛出数据类型错误的异常,
除去效率问题,楼主的问题其实就跟问:我们既然已经有了public了,为什么还要internal、protected、privte干什么?
--------------------------------------------------------------------------------------------
************************************************************************
--------------------------------------------------------------------------------------------
6 楼xxqq0824(赛跑)回复于 2006-04-12 11:47:24 得分 0
泛型就是需要在编译时才能确认占位符的类型,所以跟arraylist相比,只能受益小众,但效率要比arraylist高出很多。我的理解正确吗?因为微软还没有抛弃arraylist,它还是有需要的地方的
--------------------------------------------------------------------------------------------
************************************************************************
--------------------------------------------------------------------------------------------
7 楼Mingle_Qin(sdfsdf)回复于 2007-03-01 16:43:00 得分 0
开发较简单的中小型软件,效率在高CPU及大容量内存的前提下,泛型编程就只能是多此一举了...而且在逻辑关系并不复杂的前提下,没必要用泛类.是这样吧?
--------------------------------------------------------------------------------------------
************************************************************************
--------------------------------------------------------------------------------------------
8 楼0009(夏天以南)回复于 2007-03-01 16:49:27 得分 0
自己写点应用就不会有这些疑问了,真是的.
--------------------------------------------------------------------------------------------
************************************************************************
--------------------------------------------------------------------------------------------
9 楼0009(夏天以南)回复于 2007-03-01 16:50:41 得分 0
实际应用中,List的用途比ArrayList广泛得多.
就像你经常用string而不用object一样.明白吗?
--------------------------------------------------------------------------------------------
************************************************************************
--------------------------------------------------------------------------------------------
看了一下,觉得自己明白一点了,马上打开VS2003,试了一下,发现2003没有泛型!
看来,我还是菜鸟!
浙公网安备 33010602011771号