泛型

泛型是通过参数化类型来实现在同一份代码上操作多种数据类型的技术。
利用“参数化类型”将类型抽象化,从而实现灵活的复用。

泛型 约束:格式  where T :约束需要符合的条件.
struct 约束 是值类型.
class 约束 是引用类型.
new() 约束 有一个空的构造函数,如果包含new()约束,则必须放在最后一个.
基类名  约束 要求传入的类型 可以是基类(父类)的本身,也可以是它的派生类(子类).
接口名称  约束 要求传入的类型 可以是基类接口(父类)的本身,也可以是它的派生类(子类).
声明一个泛型的方法 方法名后边 需要有一个<T>,其中字母T 不是固定的,也可使用其他字母.
T 相当于就占了一个坑 ,又相当于是一个 代表了一个数据类型的参数占位符.
泛型的优点是:
1. 泛型增强了代码的可读性。
2. 泛型有助于实现代码的重用、保护类型的安全以及提高性能。
3. 我们可以创建泛型集合类。
4. 泛型实现了类型和方法的参数化。
5. 我们还可以对泛型类进行约束以访问特定数据类型的方法。
6. 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。

泛型是具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。
泛型集合类可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其字段的类型及其方法的参数类型出现。
泛型方法可以将其类型参数用作其返回值的类型或者其某个形参的类型。

泛型的定义主要有以下两种:
1.在程序编码中一些包含类型参数的类型,也就是说泛型的参数只可以代表类,不能代表个别对象。
2.在程序编码中一些包含参数的类。其参数可以代表类或对象等等。不论使用哪个定义,泛型的参数在真正使用泛型时都必须作出指明。
一些强类型编程语言支持泛型,其主要目的是加强类型安全及减少类转换的次数,但一些支持泛型的编程语言只能达到部分目的。
允许对个别泛型的类型参数进行约束,包括以下几种形式(假设 C是泛型的类型参数,
是一般类、泛类,或是泛型的类型参数):T 是一个类。T 是一个值类型。T 具有无参数的公有建构方法。T 实现接口 I 。T 是 C ,或继承自 C 。

类型定义时,将指定类型参数(Type Parameter,通常以T 表示),紧随类名,并包含在<>符号内。
具有类型参数的类型其为:开放式类型;
而对于为类型参数传入实际参数的类型被称为:封闭式类型

T:结构    类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。
T:类    类型参数必须是引用类型,包括任何类、接口、委托或数组类型。
T:new()      类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new()?约束必须最后指定。
T:<基类名>  类型参数必须是指定的基类或派生自指定的基类。
T:<接口名称> 类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。

泛方法可以存在于泛型类,也可以在于非泛型类中。
泛型类型参数作为某个方法的参数、返回值、或者局部变量,
该类型参数可能并不被整个类所需要,而更明确的用于某个方法。

在.NET 框架类库中的泛型接口,还包括 ICollection<T>、Icomparable<T>、
Icomparer<T>、IDictionary<Tkey,TValue>等等。

常见泛型集合类:
List<T> 对应ArrayList集合类
SortedList<TKey, TValue> 对应SortedList集合类
Queue<T> 先进先出的集合类
Stack<T> 后进先出的集合类
Collection<T> 自定义泛型集合的基类
Dictionary<TKey, TValue> 对应于Hashtable集合类