所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。
范型类
class Stack<T>
{
private T[] store;
private int size;
public Stack()
{
store = new T[10];
size = 0;
}
public void Push(T x)
{
store[size++] = x;
}
public T Pop()
{
return store[--size];
}
}
{
private T[] store;
private int size;
public Stack()
{
store = new T[10];
size = 0;
}
public void Push(T x)
{
store[size++] = x;
}
public T Pop()
{
return store[--size];
}
}
这里的T即指一个类型参数,当然你也可以用A,B,C来代替。在范型类中,可以在任意的地方使用这个类型T,而T的具体类型,则在实例化这个范型类的时候指定。
Stack<int> stack1 = new Stack<int>();
stack1.Push(100);
int current1 = stack1.Pop();
Stack<string> stack2 = new Stack<string>();
stack2.Push("Hello");
string current2 = stack2.Pop();
stack1.Push(100);
int current1 = stack1.Pop();
Stack<string> stack2 = new Stack<string>();
stack2.Push("Hello");
string current2 = stack2.Pop();
范型方法
public static bool Eixsts<T>(T[] items, T item)
{
for (int i = 0; i < items.Length; i++)
{
if (items[i].Equals(item))
{
return true;
}
}
return false;
}
{
for (int i = 0; i < items.Length; i++)
{
if (items[i].Equals(item))
{
return true;
}
}
return false;
}
范型约束
C#范型要求对“所有范型类型或范型方法的类型参数”的任何假定,都要基于“显式的约束”,以维护C#所要求的类型安全。“显示约束”由where子句表达,可以指定“基类约束”,“接口约束”,“构造器约束”,“值类型/引用类型约束”,共四种约束。“显示约束”并非必须,如果没有指定“显示约束”,范型类型参数将只能访问System.Object类型中的公有方法。
class A { public void F1(){...}}
class B { public void F2(){...}}
Class C<S,T>
where S: A //S继承自A
where T: B //S继承自B
{
// 可以在类型为S的变量上调用F1,
// 可以在类型为T的变量上调用F2,
。。。
}
class B { public void F2(){...}}
Class C<S,T>
where S: A //S继承自A
where T: B //S继承自B
{
// 可以在类型为S的变量上调用F1,
// 可以在类型为T的变量上调用F2,
。。。
}