WEB开发网
开发学院软件开发C语言 C# 特性之泛型 阅读

C# 特性之泛型

 2010-09-30 22:35:56 来源:WEB开发网   
核心提示: 和类声明继承关系时一样,泛型约束可以声明多个接口和最多一个基类约束,C# 特性之泛型(4),并且如果声明了基类约束,类约束必须放在约束条件的首位,你不能这样定义:class ClassA<T> where T:Delegate. 这是由于委托和枚举被认为是特殊的类,它无法被指定为类型

和类声明继承关系时一样,泛型约束可以声明多个接口和最多一个基类约束,并且如果声明了基类约束,类约束必须放在约束条件的首位,这和我们声明类的继承关系要求一样。另外,声明约束的类不能是密封类或某些特殊的结构(如Nullable<T>),如我们不能声明约束类为string或 System.Nullable<T>.最后,与我们在类声明多个接口继承关系一样,泛型的约束间是AND而非OR关系,也就是说,如果你添加了多个约束,那么泛型使用必须满足所有的约束条件。

我们可以通过关键字class和struct来限定类型是值类型还是引用类型,不过由于基类约束已经表明了泛型类型是类还是结构,所以我们不能同时将 class或struct约束和基类(结构)约束一起使用,e.g.class ClassA<T>where T:BaseClass,class 是不允许的。另外一个需要注意的就是class和struct约束也必须在其他任何约束条件之前。

另外一个值得注意的约束关键字是new(), new 关键字意味着泛型对象必须提供一个无参构造函数,需要注意的是,new()约束必须放在所有约束的最后面。这个约束有时会有用,不过有时看起来更像鸡肋。首先,new()约束虽然表明你可以在类中对泛型对象使用new()操作符实例化对象,然而在CIL对该对象的实例化仍然是通过反射来实现的,即T a=new T()相当于T a = System. Activator. CreateInstance<T>();这样程序效率会有所降低。另一方面,目前new约束仅仅支持无参构造函数的约束,而无法支持用户自定义参数的构造函数约束,虽然用户可以自己通过工厂方法来传递参数,但终究不够自由,这让new()约束有时没太大用武之地。

约束不支持委托和枚举类型,例如,你不能这样定义:class ClassA<T> where T:Delegate. 这是由于委托和枚举被认为是特殊的类,它无法被指定为类型参数。编译器无法根据Delegate来完成编译器的类型检查。

上一页  1 2 3 4 5  下一页

Tags:特性

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接