heartstill

博客园 首页 新随笔 联系 订阅 管理

泛型的Where

 

泛型的Where能够对类型参数作出限定。有以下几种方式。

 

l         where T : struct   限制类型参数T必须继承自System.ValueType。

 

l         where T : class    限制类型参数T必须是引用类型,也就是不能继承自System.ValueType。

 

l         where T : new()   限制类型参数T必须有一个缺省的构造函数

 

l         where T : NameOfClass 限制类型参数T必须继承自某个类或实现某个接口。

 

以上这些限定可以组合使用,比如:

 

public class Point<T> where T : class, IComparable, new()

 

 

 

泛型的机制

 

l  机制: C#泛型代码在被编译为IL代码和无数据时,采用特殊的占位符来表示泛型类型,并用专有的IL指令支持泛型操作。而真正的泛型实例化工作以on-demand的方式,发生在JIT编译时。

 

l  编译机制:

 

1.第一轮编译时,编译器只为Stack<T>(栈算法)类型产生“泛型版”的IL代码与元数据-----并不进行泛型类型的实例化,T在中间只充当占位符

 

2. JIT编译时,当JIT编译器第一次遇到Stack<int>时,将用int替换“泛型版”IL代码与元数据中的T---进行泛型类型的实例化。CLR为所有类型参数为“引用类型”的泛型类型产生同一份代码;但如果类型参数为“值类型”,对每一个不同的“值类型”,CLR将为其产生一份独立的代码。

 

 

 

泛型的一些问题

 

l 不支持操作符重载。我只知道这么多了

 

 

 

范型的意义

 

泛型的意义何在?类型安全和减少装箱、拆箱并不是泛型的意义,而是泛型带来的两个好处而已(或许在.net泛型中,这是最明显的好处了)。泛型的意义在于 ——把类型作为参数,它实现了代码之间的很好的横向联系,我们知道继承为代码提供了一种从上往下的纵向联系,但泛型提供了方便的横向联系(从某种程度上说,它和AOP在思想上有相通之处)。在PersonCollection例子中,我们知道Add()方法和Remove()方法的参数类型相同,但我们明确无法告诉我们的程序这一点,泛型提供了一种机制,让程序知道这些。道理虽然简单,但这样的机制或许能给我们的程序带来一些深远的变化吧。

 

posted on 2011-09-26 16:54  开始测试  阅读(967)  评论(0编辑  收藏  举报