.NET1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持。在机房重构的过程中,我们也都使用了泛型,那时是初次接触,至于详细的真的是不理解?那么泛型是什么,我们先从理解泛型开始。
我们先思考这么一个问题:如果由你来实现一个冒泡排序,如果没有泛型,你会这么写:
<span style="font-family:KaiTi_GB2312;font-size:18px;"> public class SortHelper
{
public void BubbleSort( int[] array)
{
int length = array.Length;
for (int i = 0; i <= length - 2; i++)
{
for (int j = length - 1; j >= 1; j--)
{
// 对两个元素进行交换
if (array[j] < array[j - 1])
{
int temp = array[j];
array[j] = array[j - 1];
array[j - 1] = temp;
}
}
}
}
</span>
上面的方法体就是一个冒泡排序,咱们重要看的是所传参数类型,接下来
<span style="font-family:KaiTi_GB2312;font-size:18px;">class Program
{
static void Main(string[] args)
{
SortHelper sorter = new SortHelper();
int[] array = { 8, 1, 4, 7, 3 };
sorter.BubbleSort(array);
foreach (int i in array)
{
Console.Write("{0} ", i);
}
Console.WriteLine();
Console.ReadKey();
}
}
</span>
这个程序就可以运行了,结果是一个从小到大的排序。我们发现他运行良好,欣喜地认为这便是解决方案了。
但是后来,又需要对一个byte类型的数组进行排序,由于c#是一个强类型的语言,所以最快的办法就是把代码复制一下。那么问题就出来了,如果我再对其他数据类型进行排序呢,总不能一个接着一个复制吧。
这时候,我们就要去想解决方案,我们可以将所传参数看作为一个占位符,由于是一个占位符,因此可以代表任何的类型。我们会发现定义占位符的最好方式就是将int[]、byte[]、char[]用占位符替代掉。占位符用T[]来表示,所以T可以代表任何类型。
而我们需要使用一种特殊的语法来传递这个T占位符,.NET提供了专门的语法来传递占位符,其中一种就是在定义类型的时候传递,此时类型也就变成了泛型类。
<span style="font-family:KaiTi_GB2312;font-size:18px;">public class SortHelper<T>{
public void BubbleSort(T[] array){
//方法实现体
}
}</span>
当需要为一个int类型的数组排序时:
<span style="font-family:KaiTi_GB2312;font-size:18px;">SortHelper<int> sorter=new SorterHelper<int>();
int[] array ={8.1.4.7.3};
sorter.BubbleSort(array);
</span>
可以看到,通过使用泛型,极大地减少了重复代码,使程序更加清爽,泛型类就类似于一个模板,可以在需要时为这个模板传入任何需要的类型。同样,我们平常所见到的泛型是和其他知识混合一起出现的,像泛型集合,反射泛型,委托泛型。我们要做的是逐个破解。