我们在编写程序时,经常遇到两个模块的功能非常相似,只是一个是处理int数据,另一个是处理string数据,或者其他自定义的数据类型,但我们没有办法,只能分别写多个方法处理每个数据类型,因为方法的参数类型不同。有没有一种办法,在方法中传入通用的数据类型,这样不就可以合并代码了吗?泛型的出现就是专门解决这个问题的。
如果不久以后需要对一个byte类型的数组进行排序,而上面的排序算法只能接受一个int类型的数组,此时上面一段代码要改的地方也就一处
BubbleSort(int[] array)改成BubbleSort(byte[] array)即可,但是我们需要从新写方法,这样代码就有重复的。为了解决这个问题泛型产生。
我们使用占位符 T来表示任何类型。这样就屏蔽了方法签名的差异
现在看起来不错,但是还有一个问题:如何指定T是int,byte,还是char?
当定义一个类,并且这个类需要引用它本身以外的其他类型时,可以定义带参数的构造函数,然后将它需要的类型实例通过构造函数的参数传递进来。但是在上面,参数T本身就是一个类型(类似于int,byte,char,而不是类型的实例,比如1和‘a’)。很明显无法在构造函数中传递T类型的数组,因为参数接受的是类型的实例,而T是类型本身。
此时需要一种特殊的语法来传递这个T占位符,.net提供了专门的语法来传递T占位符,其中一种就是在定义类型的时候传递。此时,类型也就变成了泛型类。
public class SortHelper<T>{
public void BubbleSort(T[] array){
//方法实现体
}
}
在类型名称的后面加一个尖括号,使用这个尖括号来传递占位符,也就是类型参数。接下来看一下如何使用泛型。当需要一个int类型的数组排序时。
SortHelper<int> sorter=new SortHelper<int>();
int[] array={8,1,4,7,3};
sorter.BubbleSort(array);
当需要为一个byte类型的数组排序时:
SortHelper<byte> sorter=new SortHelper<byte>();
byte[] array={8,1,4,7,3};
sorter.BubbleSort(array);
可以看出:泛型类就类似于一个模板,可以在需要时为这个模板传入任何需要的类型。更专业一点,为这一节的占位符起一个正式的名称。叫类型参数。