【文件属性】:
文件名称:泛型处理-effective.debugging.2016.7
文件大小:8.09MB
文件格式:PDF
更新时间:2024-06-23 11:46:50
C#网络应用
4.7 泛型处理
泛型(Generic)是对 CLR 类型系统的扩展,用于定义未指定某些细节的类型。实际上,
代码本身就是泛型。
使用泛型可以避免以下两个常见的问题:代码冗余和困扰开发人员的含混不清的编译器错
误。假设集合类 SortedList 是 Object 引用的集合,GenericSortedList是任意类型的集合。使
用泛型具有以下明显的优点。
1) 类型安全
当用户向 SortedList 类型的集合内添加 String 时,String 会隐式强制转换为 Object。同样,
如果从该列表中检索 String 对象,则它必须在运行时从 Object 引用强制转换到 String 引用。
这样就会造成编译时缺少类型安全,从而使编写的代码容易出错。相反,如果使用
GenericSortedList(T 的类型被设置为 String),就会使所有的添加和查找方法使用 String
引用。这样就可以在编译时就检查元素的类型是否正确。
2) 二进制代码重用
为了进行维护,开发人员可以选择使用 SortedList,通过从它派生 SortedListOfString 来实
现编译时的类型安全。此方法有一个问题,那就是必须对于每个需要类型安全列表的类型都编
写新代码,而这会很快变成非常费力的工作。使用 GenericSortedList,需要执行的全部操
作就是将具有所需元素类型的类型实例化为 T。泛型代码还有一个附加价值,那就是它在运行
时 生 成 , 因 此 , 对 于 无 关 元 素 类 型 的 两 个 扩 展 ( 如 GenericSortedList 和
GenericSortedList)能够重新使用同一个实时(JIT)编译代码的大部分。CLR 只
是处理细节就可以了,从而使代码不再臃肿!
3) 性能
如果能在编译时进行类型检查,而不是在运行时进行检查,则显然会大大增强系统的性能。
在托管代码中,引用和值之间的强制转换既会导致装箱又会导致拆箱,而且避免这样的强制转
换可能会对性能产生同样的负面影响。如果对一个由一百万个整数组成的数组进行快速排序法
基准测试,就会发现泛型方法比非泛型方法快的多。这是由于完全避免了对这些值进行装箱。
如果针对由字符串引用组成的数组进行同样的排序,则由于无需在运行时执行类型检查,因此
使用泛型方法后大大提高了性能。
4) 清晰性
泛型的清晰性体现在许多方面。约束是泛型的一个功能,它会禁止对泛型代码进行不兼容
的扩展;使用泛型,也不再有困扰 C++ 模板用户的含混不清的编译器错误。在
94