10-泛型概述
16.3.1 泛型概述
在16.2节介绍的ArrayList类中,所有的元素类型都为object类型。.NET中的object类是所有类的基类,因此ArrayList类能够接受任何类型的值作为它的元素。当使用ArrayList中的元素时,必须要强制进行类型的转换,将元素转换为合适的元素类型。如果元素是值类型的值,会引起CLR进行拆箱和装箱的操作,造成一定的性能开销。而且,还必须小心处理类型转换中可能出现的错误。例如,下面的语句为ArrayList对象添加多个不同类型的元素值,就会引入装箱和拆箱操作,造成一定的性能开销。
01 ArrayList list = new ArrayList(); //创建一个ArrayList对象list
02 list.Add("这是一个字符型"); //添加一个字符串
03 list.Add(8); //添加一个整型
04 list.Add(true); //添加一个布尔型
事实上在很多场合,应用程序并不需要像上面的代码那样,向一个ArrayList集合类中添加各种不同的类型。如果只需要处理同种类型的元素,比如整型,可以将ArrayList集合中的元素定义为确定的类型,或称之为强类型。这样就可以减少类型转换带来的性能开销,而且也可避免类型转换中可能会出现的错误。这种方式解决了以object作为参数的缺陷,而且工作得也还不错。但是,如果还需要强类型字符串值、布尔值或其他的类型,就必须一一地实现这些强类型类,这些重复工作显然增加了代码量。为此在.NET 2.0中引入了泛型来处理这种不足,经由指定一个或多个类型占位符,在处理类型操作时,不需要知道具体的类型,而将确定具体类型的工作放在运行时来实现。
什么是泛型?泛型是一种类型占位符,或称为类型参数。我们知道在一个方法中,一个变量的值可以作为参数,但其实这个变量的类型本身也可以作为参数。泛型允许程序员在代码中将变量或参数的类型先用“类型占位符”来代替,在调用的时候再指定这个类型参数是什么。泛型就好比Word中的模板,在Word的模板中提供了基本的文档编辑内容,在定义Word模板时,对具体编辑哪种类型的文档是未知的。在.NET中,泛型则提供了类、结构、接口和方法的模板,与定义Word模板时类似,定义泛型时的具体类型是未知的。在.NET中,泛型能够给我们带来的好处是“类型安全和减少装箱、拆箱”。
在 System.Collections.Generic命名空间中包含了个泛型集合类,List