C# 泛型

转载自:http://topic.csdn.net/t/20060411/18/4679399.html
-------------------------------------------------------------------------------------------
我在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没有泛型!
看来,我还是菜鸟!

posted on 2008-02-03 10:42  Kyo.枫  阅读(178)  评论(0)    收藏  举报