剖析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命名空间中的那些。

  可以肯定,在一段相当长的时间里,泛型将会象模式和重构等革新一样对开发带来越来越大的价值,而且新的数据结构能被转换成可重用的如泛型等的代码元素。

posted @ 2009-04-09 11:56  翔宇编程  阅读(260)  评论(0编辑  收藏  举报
51CTO