目录
20.通过Icomnparable与Icomparer定义顺序关系
21.创建泛型类时,总是应该给实现了IDisposable的类型参数提供支持
25.如果不需要把类型参数所表示的对象设为实例字段,那么应该优先考虑创建泛型方法,而不是泛型类
18.只定义刚好够用的约束条件
不设定泛型约束就需要在方法体中添加大量的类型判断代码来保证类型
New()约束一般来说没有必要的话可以用default(T来代替
19.通过运行期类型检查实现特定的泛型算法
更加通用就意味着无法利用具体类型所带来的优势
20.通过Icomnparable<T>与Icomparer<T>定义顺序关系
21.创建泛型类时,总是应该给实现了IDisposable的类型参数提供支持
如果根据类型参数去创建实例需要保证,实例类型是否实现了IDispose接口,实现了就需要编写相关代码
22.考虑支持泛型协变与逆变
如果某个类型的值无法当成另外一种类型的值使用,称为不变
如果在X可以转换成Y的前提下能够把C<X>当成C<Y>,叫做该泛型对T协变
如果在Y可以转换成X的前提下能够把C<X>当成C<Y>,叫做该泛型对T协变
在泛型接口上采用out关键字修饰类型参数T,令其只能放出现在那些用于输出(output)的位置上
将out改为in用于输入(in)的位置上为逆变
23.用委托要求类型参数必须提供某种方法
24.如果有泛型方法,就不要再创建针对基类或接口的重载版本
泛型方法总是会优先与其他普通重载方法,如果参数条件匹配的话。
25.如果不需要把类型参数所表示的对象设为实例字段,那么应该优先考虑创建泛型方法,而不是泛型类
泛型方法提供的泛型参数只需要与该方法的要求相符就行,而泛型类提供的泛型参数要满足该类定义的每一条约束。也会为每一套泛型参数生成不同的IL代码。
26.实现泛型接口的同时,还应该实现非泛型接口
.NET是2.0支持泛型的,还有很多非泛型的代码需要兼容。
27.只把必备的方法定义在接口中,把其他功能留给扩展方法
Linq就是最好的例子。扩展方法包括where orderby thenby group
如果扩展方法和接口本身方法重名,重复。会优先调用接口,类本身的方法
28.考虑通过扩展方法增强已构造类型的功能
主要是最大限度的将数据的存储模型与使用解耦