倔强的土豆

这只是一个备份!源地址:http://blog.csdn.net/stubbornpotatoes
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

泛型和集合

Posted on 2011-06-18 10:04  倔强的土豆  阅读(1129)  评论(2编辑  收藏  举报

  集合:ArrayList类,是命名空间System.Collections下的一部分,它是使用大小可按需动态增加的数组实现IList接口,但是ArrayList不是类型安全的。

  泛型集合:list类,是对ArrayList的一个完善。通常情况下建议使用泛型集合,因为这样可以获得类型安全的直接优点。

  Ilist接口:为ArrayList和List定义了一些操作方法。

  • 对于泛型技术我个人理解也不是很深入,通过这些天不断地使用,说一下我的理解。
    泛型是.NET 2.0引进的新技术,它允许我们定义代码模板,然后使用这个模板声明变量。它所在的位置大多位于System.Collections.Generic中。
    泛型引入目的:
    创建强数据类型的集合。因为泛型集合是强类型化得,所以其处理速度要比基于继承的集合模型快,代码中使用集合类的任何地方可以考虑使用泛型集合代替。
    泛型通常采用List(Of T)的形式,这里List是类型(或者类)的名字,字母T类似参数的占位符。使用List(Of T)声明变量的代码如下:
  • Dim Data as New List(Of T)

  • 称泛型是强类型集合就是说,一旦类型参数T定义好了类型,List就只能存放该类型的变量,相比ArrayList就不同了,ArrayList属于后期绑定,所以可以盛放任何类型的对象。
  • 例1.缺乏类型安全的ArrayList
  • namespace TestApp
    {
    class Test
    {
    [STAThread]
    static void Main(string[] args)
    {
    ArrayList list
    = new ArrayList();
    list.Add(
    3);
    list.Add(
    4);
    //list.Add(5.0);
    int total = 0;
    foreach (int val in list)
    {
    total
    = total + val;
    }
    Console.WriteLine(
    "Total is {0}", total);
    }
    }
    }

本例中,我们建立了一个ArrayList的实例,并把3和4添加给它。然后我循环遍历该ArrayList,从中取出整型值然后把它们相加。这个程序将产生结果"Total is 7"。现在,如果我去掉下面语句的注释:

list.Add(5.0);

程序将产生如下的运行时刻异常.

注意:上面的实例,如果是用VB.NET书写的话,是不会失败的。原因在于,VB.NET不使用装箱机制,它激活一个把该double转换成整型的方法。但是,如果ArrayList中的值是不能转换成整型的,VB.NET代码还会失败。

作为一个习惯于使用语言提供的类型安全的程序员,你希望这样的问题在编译期间浮出水面,而不是在运行时刻。这正是泛型产生的原因。

例2.类型安全的泛型列表

List<int> aList = new List<int>();
aList.Add(
3);
aList.Add(
4);
// aList.Add(5.0);
int total = 0;
foreach(int val in aList)
{
total
= total + val;
}
Console.WriteLine(
"Total is {0}", total);
在例2中,我编写了一个泛型的列表的例子,在尖括号内指定参数类型为int。该代码的执行将产生结果"Total is 7"。现在,如果我去掉语句doubleList.Add(5.0)的注释,我将得到一个编译错误。编译器指出它不能发送值5.0到方法Add(),因为该方法仅接受int型。不同于例1,这里的代码实现了类型安全。