所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型。泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。
范型类
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,
。。。
}