剖析C# 2.0泛型类的创建和使用(三)
最后要讨论的是约束问题。约束被应用于类或其它特性上并且使用下面的语法:
Where T : constraint_type
例如,任何我们想要通过using语句所使用的,如一个SqlDataReader,必须实现Idisposable接口。这是因为如下方式使用的using语句:
using(Form f = new Form()){...}
就象一个try..finally块一样工作-总是清除新创建的资源。其工作原理很简单,只需要CLR针对在该using语句中创建的对象发出一个到IDisposable.Dispose的调用即可。例如,在上面这一句中,一个新的表单被创建,并且在using语句退出之前即调用Form.Dispose。
要对一个泛型类施加以确保该类实现了接口IDisposable,我们将添加先行词where T:Idisposable。在列表4中的泛型列表上施加约束后,我们将重新修改列表4如下面的列表5所示。
列表5 增加一个约束到泛型类以确保我们的List<T>中的所有的值T实现接口Idisposable。
using System;
using System.Collections;
using System.Text;
namespace Generics{
public class List<T> : CollectionBase where t : IDisposable{
public List(){ }
public T this[int index]{
get { return (T)List[index]; }
set { List[index] = value; }
}
public int Add(T value){return List.Add(value);}
}
}
先行词where的值可以是类,接口,结构,实现一个无参的公共构造器或有一个特定的基类的类。详见有关帮助文档。
八、 总结
泛型的设计是用来减少你重复实现的代码的次数-只需改变数据类型即可。因为抽象数据结构,如队列,栈和列表皆是典型的数据结构,所以存在针对这些东西的泛型类完全可以理解。你可以从.NET中派生大量的值-通过使用现有的泛型类,如在System.Collections.Generic命名空间中的那些。
可以肯定,在一段相当长的时间里,泛型将会象模式和重构等革新一样对开发带来越来越大的价值,而且新的数据结构能被转换成可重用的如泛型等的代码元素。