也谈IDisposable接口(二)

来源:互联网 发布:那曲数控编程人才网 编辑:程序博客网 时间:2024/05/17 23:19

关于资源释放,最后一点需要提的是Close函数。在语义上它和Dispose很类似,按照MSDN的说法,提供这个函数是为了让用户感觉舒服一点,因为对于某些对象,例如文件,用户更加习惯调用Close()

 

然而,毕竟这两个函数做的是同一件事情,因此MSDN建议的代码就是: 

 

  1. public void Close()
  2.  {
  3.      Dispose(();
  4.  }

这里直接调用不带参数的Dispose函数以获得和Dispose相同的语义。这样似乎就圆满了,但是从另外一方面说,如果同时提供了DisposeClose,会给用户带来一些困惑。没有看到代码细节的前提下,很难知道这两个函数到底有什么区别。因此在.NET的代码设计规范中说,这两个函数实际上只能让用户用一个。因此建议的模式是: 

 
  1.  public class BaseResource: IDisposable
  2.   {
  3.       public void Close()
  4.       {
  5.          Dispose();
  6.       }
  7.    
  8.       void IDisposable.Dispose()
  9.       {
  10.         Dispose(true);
  11.         GC.SuppressFinalize(this);
  12.      }
  13.   
  14.      protected virtual void Dispose(bool disposing)
  15.      {
  16.         // 同前
  17.      }
  18.  } 
 

这里使用了一个所谓的接口显式实现:void IDisposable.Dispose()。这个显式实现只能通过接口来访问,但是不能通过实现类来访问。因此:

 

 

  1. BaseResource baseRes= new BaseResource ();
  2. baseRes.Dispose(); // 错误
  3. (baseRes as IDisposable).Dispose(); // 正确

 

这样做到了兼顾两者。对于喜欢使用Close的人,可以直接用 baseRes.Close(),并且他看不到 Dispose()。对于喜欢Dispose的,他可以把类型转换为 IDisposable 来调用,或者使用using语句。两者皆大欢喜!

原创粉丝点击