泛型实现了类型参数化,达到代码重用的目的,通过类型参数化来实现同一份代码上操作多种类型。泛型相当于类型占位符,定义类或方法时使用替代符代表变量类型,当使用类或者方法时再具体指定变量。
泛型允许我们延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候,例如:分布式缓存队列、EF的延迟加载等等。换句话说,泛型允许我们编写一个可以与任何数据类型一起工作的类或方法。我们可以通过数据类型的替代参数编写类或方法的规范。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理指定的数据类型。
在泛型类型或方法定义中,类型参数是在其实例化泛型类型的一个变量时,客户端指定的特定类型的占位符。 泛型类无法按原样使用,因为它不是真正的类型;它更像是类型的蓝图。 若要使用 ,客户端代码必须通过指定尖括号内的类型参数来声明并实例化构造类型。 此特定类的类型参数可以是编译器可识别的任何类型。 可创建任意数量的构造类型实例,其中每个使用不同的类型参数。
泛型类和泛型接口的基本语法:
class 类名<泛型占位字母> interface 接口名<泛型占位字母>
泛型函数的基本语法:
函数名<泛型占位字母>(参数列表)//需要主义的是,泛型占位字母可以有多个,但是需要用逗号隔开
泛型的特性
使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:
它有助于我们最大限度地重用代码、保护类型的安全以及提高性能。
我们可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。我们可以使用这些泛型集合类来替代 System.Collections 中的集合类。
我们可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
我们可以对泛型类进行约束以访问特定数据类型的方法。
关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取。
泛型委托
我们可以通过下列代码来类型参数定义泛型委托。
delegate T NumberChanger<T>(T n);
泛型的作用
1. 不同类型对象的相同逻辑处理就可以选择泛型。
2. 使用泛型可以一定程度避免装箱拆箱。
需要注意的是,泛型真正起作用的时候,是在使用它的时候。