摘要: public static T Min<T o1,T o2> where T:IComparable<T>{ if(o1.CompareTo(02)<0) return o1; return o2;}C#的关键字where告诉编译器,为T指定的任何类型都必须实现同类型(T)的泛型IComparable接口,有了这个约束,就可以在方法中调用CompareTo,因为已知IComparable<T>接口定义了CompareTo现在,当代码引用一个泛型类型或者方法时,编译器要负责保证类型实参符合指定的约束,例如,假如编译以下代码:public static v 阅读全文
posted @ 2012-11-26 14:48 Lordbaby 阅读(869) 评论(0) 推荐(0) 编辑
摘要: 含义:在使用泛型类型参数的方法在进行JIT编译时,CLR获取方法的IL,用指定的类型实参进行替换,然后创建恰当的本地代码,这是泛型的主要特性之一。然而有一个缺点,CLR要为每种不同的方法/类型组合生成本地代码,我们将这种现象称之为代码爆炸(code explosion),它会使应用程序的工作集显著增大,从而损害性能。当然CLR不会坐视不管的,会提供一系列的优化措施,能够缓解代码爆炸1.首先,假如为一个特定的类型实参调用了一个方法,以后再次使用相同类型实参来调用这个方法,CLR只会为这个方法/类型组合编译一次代码。所以,如果一个程序集使用List<DateTime>,一个完全不同的程 阅读全文
posted @ 2012-11-26 10:32 Lordbaby 阅读(528) 评论(0) 推荐(0) 编辑
摘要: 有时候反省语法会将开发人员弄糊涂,因为源代码中可能散布着大量的“<”和“>”符号,这会有损可读性。为了对语法的进行增强,有的开发人员定义了一个新的非泛型类型,他从一个泛型类型派生,并指定了所有类型实参,例如,为了简化下面这样的代码:一些开发人员可能首先定义下面这样一个类:internal sealed class DateTimeList:List<DateTime>{ //这里无需放入任何代码}然后就可以进行下一步简化创建列表的代码(没有了“<”和“>”符号):DateTimeList dt = new DateTimeList();这样做表面上是方便了( 阅读全文
posted @ 2012-11-26 10:30 Lordbaby 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 泛型类型仍然是类型,所以它能从其他任何类型派生,使用一个泛型类型并指定类型实参时,实际是在CLR中定义一个新的类型对象,新的类型对象是从泛型类型派生自的那个类型派生的,换言之,由于List<T>是从Object派生的,所以List<String>和List<Guid>也从Object派生。类似地,由于DictionaryStringKey<TValue>派生自Dictionary<String,TValue>所以DictionaryStringKey<Guid>派生自Dictionary<String,Guid> 阅读全文
posted @ 2012-11-26 10:27 Lordbaby 阅读(816) 评论(0) 推荐(0) 编辑
摘要: 在.NET中,CLR会为应用程序使用的每个类型创建一个内部数据结构,这种数据结构成为:类型对象(type Object)。具有泛型类型参数的类型仍然是类型,CLR同样会为它创建一个内部类型对象。无论是引用类型(类)、值类型(结构)、接口类型,还是委托类型,这一点都是成立的。然而,具有泛型类型参数的类型称之为:开放类型(open type),CLR禁止构造开发类型的任何实例。这一点类似于CLR禁止构造结构类型的实例。代码引用一个泛型类型时,可指定一组泛型类型实参,假如所有类型实参传递的都是实际数据类型,类型就称为封闭类型(closed type)。CLR允许构造封闭类型的实例,然而,当代码引用一 阅读全文
posted @ 2012-11-26 10:22 Lordbaby 阅读(3030) 评论(0) 推荐(2) 编辑