第
1
1111章
C
CCCC#
####中的泛型
.Net
1.1版本最受诟病的一个缺陷就是没有提供对泛型的支持。通过使用泛型,我们可以
极大地提高代码的重用度,同时还可以获得强类型的支持,避免了隐式的装箱、拆箱,在一定程
度上提升了应用程序的性能。本文将
系统地为大家讨论泛型,我们先从理解泛型开始。
1.1.1.1.1
1111理解泛
理解泛理解泛理解泛理解泛型
型型型型
1.1.1.1.1111.
....1
1111为什么要有泛型?
我想不论大家通过什么方式进入了计算机程序设计这个行业,都免不了要面对数据结构和算
法这个话题。因为它是
计算机科学的一门基础学科,往往越是底层的部分,对于数据结构或者算
法的时间效率和空间效率的要求就越高。比如说,当你在一个集合类型(例如
ArrayList)的实
例上调用
Sort()方法对它进行排序时,.Net框架在底层就应用了快速排序算法。.Net框架中快速
排序方法名称叫
QuickSort(),它位于
Array类型中,这可以通过
Reflector.exe1工具查看到。
我们现在并不是要讨论这个
QuickSort()实现的好不好,效率高还是不高,这偏离了我们的主
题。但是我想请大家思考一个问题:如果由你来实现一个排序算法,你会怎么做?好吧,我们把
题目限定得再窄一些,我们来实现一个最简单的冒泡排序(Bubble
Sort)算法,如果你没有使用
泛型的经验,我猜测你可能会毫不犹豫地写出下面的代码来,因为这是大学教程的标准实现:
public
class
SortHelper{
public
void
BubbleSort(int[]
array)
{
intlength
=array.Length;
for(int
i
=
0;i
<=
length
-2;
i++)
{
for(int
j
=length
-1;
j>=
1;j--)
{
//对两个元素进行交换
if
(array[j]
<
array[j
-1]
)
{
1你可以将它理解为查看.Net框架源码的一个工具。
1
1111/
1
11114
4444
inttemp
=array[j];
array[j]
=array[j
-1];
array[j
-1]
=
temp;
}
}
}
}
}
对冒泡排序不熟悉的读者,可以放心地忽略上面代码的方法体,它不会对你理解泛型造成丝
毫的障碍,你只要知道它所实现的功能就可以了:将一个数组的元素按照从小到大的顺序重新排
列。我们对这个
程序进行一个小小的测试:
class
Program{
static
void
Main(string[]
args)
{
SortHelper
sorter
=newSortHelper();
int[]
array
={8,
1,
4,
7,
3
};
sorter.BubbleSort(array);
foreach(int
iin
array){
Console.Write("{0}
",
i);
}
Console.WriteLine();
Console.ReadKey();
}
}
输出为:
13478
2
2222/
1
11114
4444
我们发现它工作良好,欣喜地认为这便是
最好的解决方案了。直到不久之后,我们需要对一
个
byte类型的数组进行排序,而我们上面的排序算法只能接受一个
int类型的数组,尽管我们知
道它们是完全兼容的,因为
byte类型是
int类型的一个子集,但
C#是一个强类型的语言,我们
无法在一个接受
int数组类型的地方传入一个
byte数组。好吧,没有关系,现在看来唯一的办法
就是将代码复制一遍,然后将方法的签名改一个改了:
public
class
SortHelper
{
public
void
BubbleSort(int[]
array)
{
intlength
=array.Length;
for(int
i
=
0;i
<=
length
-2;
i++)
{
for(int
j
=length
-1;
j>=
1;j--)
{
//对两个元素进行交换
if
(array[j]
<
array[j
-1])
{
inttemp
=array[j];
array[j]
=array[j
-1];
array[j
-1]
=
temp;
}
}
}
}
public
void
BubbleSort(byte[]array)
{
intlength
=array.Length;
for(int
i
=
0;i
<=
length
-2;
i++)
{
for(int
j
=length
-1;
j>=
1;j--)
{
//对两个元素进行交换
3
3333/
1
11114
4444
if
(array[j]
<
array[j
-1])
{
inttemp
=array[j];
array[j]
=array[j
-1];
array[j
-1]
=
temp;
}
}
}
}
}
OK,我们再一次解决了
问题,尽管总觉得哪里有点别扭,但是这段代码已经能够
工作,按
照敏捷
软件开发的思想,不要过早地进行抽象和应对变化,当变化第一次出现时,使用最快的方
法解决它,当变化第二次出现时,再进行更好的构架和设计。这