泛型初识
泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。
.net 2.0后开始支持泛型。泛型不仅是C#的一部分,而且与程序集中的IL代码紧密集成。有了泛型,就可以创建独立于被包含类型的类和方法。我们不必须给不用的类型编写相同的方法或类。另一个减少代码的选项是object类,但是object不是类型安全的。泛型类使用泛型类型,并可以根据需要用特定的使用特定类型替换泛型类型。这就保证了类型安全性;如果某个类型不支持泛型类,编译就会出错误。
泛型并不是全新的结构,其他的语言有类似的概念。c++中的模板和泛型很相似。
c++模板是用特定的类型实例化模板,需要模板的原代码。
相反,泛型不仅仅是c#语言的一种结构,而且是CLR定义的。所以即使泛型类在c#中定义的,也可以在vb中调用特定的类型实例化该泛型。
下面我们举个例子说明泛型的使用
有时,有两个或多个类,其功能是相同的,仅仅是数据类型不同,如下面语句声明了一个类:
其作用是对两个整数作比较,可以通过调用成员函数max求最大值。
两个整型数据进行比较
class Compare_int
{
private int x, y;
public Compare_int(int a, int b)
{
x = a;
y = b;
}
public int max()
{
return (x > y) ? x : y;
}
}
如果想对两个浮点数(float型)作比较,需要另外声明一个类:
class Compare_float
{
private float x, y;
public Compare_float(float a, float b)
{
x = a;
y = b;
}
public float max()
{
return (x > y) ? x : y;
}
}
程序调用:
private void button1_Click(object sender, EventArgs e)
{
Compare_int cm=new Compare_int(3,1);
MessageBox.Show( cm.max().ToString());
Compare_float cmc = new Compare_float(3.3, 5.7);
MessageBox.Show(cmc.max().ToString());
}
显然这基本上是重复性的工作,应该有办法减少重复的工作。
我们下面用泛型来重写这个类
class Compare<T>
{
private T x, y;
public Compare(T a, T b)
{
x = a;
y = b;
}
public T max()
{
return (Convert.ToInt32(x) >Convert.ToInt32(y)) ? x : y;
}
}
程序调用:
private void button1_Click(object sender, EventArgs e)
{
//整型数据比较大小
Compare<int> cm=new Compare<int>(3,1);
MessageBox.Show( cm.max().ToString());
//浮点型数据比较大小
Compare<float> cmc1 = new Compare<float>(3.3F, 0.7F);
MessageBox.Show(cmc1.max().ToString());
//字符数据比较大小
Compare<char> cmc2 = new Compare<char>('a', 'c');
MessageBox.Show(cmc2.max().ToString());
}
通过我们泛型的使用,为我们节约了几备的工作量。