泛型和集合
集合: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]
staticvoid 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);
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,这里的代码实现了类型安全。