关于泛型的简单备忘

泛型的概念,有时候应用确实比较方便,尤其是CLASS中的应用。

1. 定义类

Code

 2. 约束

约束是使用 where 上下文关键字指定的。基本的六种类型的约束:

约束                      说明
T:结构                类型参数必须是值类型。可以指定除 Nullable 以外的任何值类型。
T:类                  类型参数必须是引用类型;这一点也适用于任何类、接口、委托或数组类型。
T:new()              类型参数必须具有无参数的公共构造函数。当与其他约束一起使用时,new() 约束必须最后指定。
T: <基类名>            类型参数必须是指定的基类或派生自指定的基类。
T: <接口名称>          类型参数必须是指定的接口或实现指定的接口。可以指定多个接口约束。约束接口也可以是泛型的。
T:U                  为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。这称为裸类型约束。

就可以:

public class EmployeeListList<T> where T : Employee
{
//your code here ...
}

 也可以:

class EmployeeList<T> where T : Employee, IEmployee, System.IComparable<T>, new()
{
// to do...
}

3. 机制

C#泛型机制:C#泛型能力由CLR在运行时支持,区别于C++的编译时的模版机制、和JAVA的编译时的“搽试法”,这使得C#泛型能力可以再各个支持CLR的语言之间进行无缝的互操作。

C#泛型编译机制
1:第一轮编译时,编译器只为stack产生“泛型版”的IL代码和元数据,并不进行泛型类型的实例化,T在中间值充当占位符。
2:JIT编译时,当JIT编译器第一次遇到stack时,将用int类型替换“泛型版”IL代码和元数据中的T进行泛型类型的实例化。
3:CLR为所有类型参数为“引用类型的”的泛型类型产生痛一份代码,但如果类型参数是“值类型”,对每个不同的“值类型”CLR将为其产生一份独立的代码。

 

 

 

 

posted on 2009-07-17 19:27  Simon Han  阅读(204)  评论(0编辑  收藏  举报