c#第1版中最受诟病的一个方面是缺乏对泛型(generics)的支持。C++中的泛型(在该语言中称为模板)很早就被公认为是完成任务的最佳方式。它可以在编译期间由一个类型定义派生出许多特定的类型,这节省了大量的时间和精力。不知道什么原因,泛型没有被纳入C#的第1版,C#因此也备受批评。也许是因为泛型是一种很难掌握的技术,也许开发人员觉得不需要泛型。幸好,C#2.0版中加入了泛型。泛型并不是真的很难掌握,只是需要用略微不同的方式处理而已。只要努力,就一定有收获。
本章的主要内容:
- 介绍泛型的概念,先学习泛型的抽象术语,因为学习泛型的概念对高效使用它是至关重要的。
- 讨论。NET Framework中的一些泛型类型,这有助于更好地理解其功能和强大之处,以及在代码中需要使用的新语法
- 定义自己的泛型类型,包括泛型的类、接口、方法和委托。还要介绍进一步定制泛型类型的其他技术:default关键字和类型约束。
12.1 泛型的概念
为了介绍泛型的概念,说明它们为什么这么有用,先回忆一下第11章中的集合类。基本集合可以包含在类似ArrayList这样的类中,但这些集合是没有类型化的,所以需要把object项转换为集合中实际存储的对象类型。继承自System。Object的任何对象都可以存储在ArrayList中,所以要特别仔细。假定包含在集合中的某些类型可能导致抛出异常,代码逻辑崩溃。前面介绍的技术可以处理这个问题,包括检查对象类型所需的代码。但是,更好的解决办法是一开始就使用强类型化的集合类。这种集合类派生于CollectionBase,并可以拥有自己的方法,来添加、输出和访问集合的成员,但它可能把集合成员限制为派生于某种基本类型,或者必须支持某个接口。