泛型

一,泛型的优势

1,源代码保护
使用泛型算法的开发人员不需要访问算法的源代码。然而,使用c++模板的泛型技术时,算法的源代码必须提供给准备使用算法的用户
2,类型安全
将泛型算法应用于一个具体的类型时,编译器和CLR能理解开发人员的意图,并保证只有与指定数据类型兼容的对象才能用于算法。试图使用不兼容的类型的对象会造成编译时错误,或在运行时抛出异常。
3,更清晰的代码
由于编译器强制类型安全性,所以减少了源代码中必须进行的强制类型转换次数,使代码更容易编写和维护。
4,更佳的性能
将泛型算法应用于一个具体的类型,避免了值类型存在装箱拆箱的操作

二、开放类型和封闭类型

1,具有泛型类参数的类型称为开放类型,CLR禁止构造开放类型的任何实例。
2,代码引用泛型类型时可指定一组泛型类型实参。为所有类型参数都传递了实际的数据类型,类型就称封闭类型。CLR允许构造封闭类型的实例

//实例开放类型(失败)
Type t = typeof (Dictionary<,>);
Activator.CreateInstance(t);

//实例封闭类型(成功)
Type t2 = typeof(Dictionary<string, string>);
Activator.CreateInstance(t);


//Dictionary:类型名
//2:类型有2个元数
//TKey,TValue:要求为TKey,TValue2个类型参数指定具体的类型
//System.Collections.Generic.Dictionary'2[TKey,TValue]
View Code

三、逆变和协变

1,不变量:意味着泛型类型参数不能改变
2,逆变量:意味着泛型类型参数可以从一个类更改为它的某个派生类。使用in关键字标记。逆变量泛型类型参数只能出现在输入位置,比如作为方法的参数
3,协变量:意味着泛型类型参数可以从一个类型改变为它的某个基类。使用out关键字标记。协变量泛型类型参数只能出现在输出位置,比如作为方法的返回类型

四、约束

1,主要约束
主要约束可以是代表非密封类的一个引用类型,两个特殊的主要类型:class和struct

2,次要类型
次要约束代表接口类型。这种约束想编译器承诺类型实参实现了接口

3,构造器约束
class a<T> where T:new(){}

4,将泛型类型变量设为默认值
class a<T> where T:new(){ T temp=default(T)}
如果T是引用类型,就将temp设为null;是值类型则设为0

学习永不止境,技术成就梦想。
原文地址:https://www.cnblogs.com/zd1994/p/6730686.html