所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型。(类型的
多态)
是一种编程范式,它利用“参数化类型”讲类型抽象化,从而实现更为灵活的复用。
1,可重用行
2,类型安全(在编译期间发现问题,而不是在运行的时候)
3,效率更高(避免装箱,拆箱的操作)
类型参数的命名准则:
1 务必使用描述性名称命名泛型类型参数
2 考虑使用T作为具有单个字母类型参数的类型参数名
3 务必将“T”作为前缀
CLASS C{}
CLASS D:C{}
CLASS E:C{}
CLASS F:C{}
CLASS G:C{} //非法 因为非泛型类型继承了未被实例化得泛型类
c#除可单独声明泛型类型(包括类和结构)外,也可在基类中包含泛型类型得声明
。但基类如果是泛型类,它的类型参数要么已实例化,要么来源于子类(同样是泛
型类型)声明的类型参数。
泛型类型的成员
Class C{
PUBLIC V f1;
PUBLIC D f2;
PUBLIC C(V x){
This.f1=x;
}
}
泛型类型的成员可以使用泛型类型声明中的类型参数。但类型参数如果没有任何约
束,则只能在该类型上使用从SYSTEM.OJBECT继承的共有成员。
泛型接口
interface ILIST{
T[] GetElements():
}
interface IDictionary{
void Add(K key,V value)
}
class List:IList,IDictionary{
public T[] GetElements(){return null;}
public void Add(int index,T value){}
}
泛型接口的类型参数要目已实例化,要么来源于实现类声明的类型参数
泛型方法的声明与调用
public calss Finder{
public static int Find(T[] items,T item){
for(int i=0;i(new int[]{1,2,3,4,5,6,8,9}, 6);
泛型方法的重载
class Myclass{
void F1(T[] a,int i); //不可以构成重载方法
void F1(U[] a,int i);
void F2(int x); //可以构成重载方法
void F2(int x);
void F3(T t) where T:A; //不可以构成重载方法
void F3(T t) where T:B;
}
泛型方法的重写
abstract class Base{
public abstract T F(T t,U u) where U:T;
public abstract T G(T t) where T:IComparable;
}
class Derived:Base{
//合法的重写,约束被默认继承
public override X F(X x,Y y){}
//非法的重写,指定任何约束都是多余的
public override T G(T t) where T:Icomparable{}
}
泛型约束
1。对“所有泛型类型或泛型方法的类型参数”的任何假定,都要基于“显示的约束”,
以维护类型安全
2。“显示约束”由WHERE字句表达,分为4种
基类约束
接口约束
构造器约束
值类型/引用类型约束
浙公网安备 33010602011771号