1)基本概念
我们在编写程序时,经常会遇到功能非常相似的模块,只是它们处理的数据类型不一样。那么问题来了,有没有一种办法,用同一个方法来处理传入不同类型参数的办法呢?
泛型的出现就是专门来解决这个问题的。
泛型(Generic)是一种规范,允许你编写类或方法时延迟给出数据类型,直到实际定义类和方法时再给出数据类型。
也就是说,定义一个泛型类时,类名的后面先用<>临时给出数据类型,然后实际使用类定义对象时,再用实际的类型去替换泛型列表(也就是<>)里的当时临时给出的类型名字;定义泛型方法与定义泛型类相似,调用的时候也是再用具体的类型进行替换。
举例如下:
static void Swap<T>(T left, T right){
T temp;
temp = left;
left= right;
right= temp;
}
// 调用swap
Swap<int>(int a, int b);
Swap<char>(char c, char d);
2)使用举例
泛型定义格式:
//定义泛型类,跟定义普通类一样,只是泛型列表临时给出类型名字
public class 泛型类名<泛型列表> {
//此处是泛型类的构造方法
public 泛型类名(数据类型 参数名) {
构造方法体……;
}
//定义T类型方法
public T functionA(数据类型 参数名) {
方法体……;
}
//此处是普通方法
public 数据类型 functionB(数据类型 参数名) {
方法体……;
}
}
//泛型列表给出的临时类型名字规范是大写,且不能是int、char这些关键字,需要自己取名字
使用格式:
泛型类名<数据类型> 泛型对象名 = new 泛型类名<数据类型>(实参)
//Example
//泛型类内部忽略
Test<int> testObj = new Test<int>(8);
//调用泛型类内部方法
testObj.functionA(cc);
testObj.functionB(cc);
应用举例:
class Test<T> {
private T[] testArray;
public Test(int size) {
testArray = new T[size];
}
public T functionA(int a) {
return testArray[a];
}
public void functionB(int b, T formal_parameter) {
testArray[b] = formal_parameter;
}
}
class Program {
static void Main(string[] args) {
Test<int> intArray = new Test<int>(8);
intArray.functionB(0, 112);
Console.WriteLine(intArray.functionA(0));
Console.ReadKey();
}
}
说明:这里定义泛型类Test对象intArray时,int型替换了泛型列表里的T类型。
灵活运用泛型,可以优化代码,减少代码量,提高效率。