为什么类会显式而不是隐式地实现IDisposable?

我正在使用FtpWebResponse类,但没有看到Dispose方法。 事实证明,该类实现了IDisposable,但是这样做是明确的,因此在调用Dispose之前,必须先将实例转换为IDisposable:

// response is an instance of FtpWebResposne
((IDisposable) response).Dispose();

为什么这样的类的设计者会选择明确地实现IDisposable? 正如Anthony Pegram所说,以这种方式做事掩盖了这样一个事实,即应该为普通开发人员处理该对象,因为他/她每次使用课程时都没有查阅文档。


这通常是在类的Close方法与Dispose完全相同的情况下完成的。 原始的Dispose隐藏在一个明确的实现中,以便完全相同的方法不具有两个名称。

这里正式推荐:

如果这样的术语是标准的,例如使用文件或套接字,则为清除目的执行Close方法。 这样做时,建议您将Close实现与Dispose相同

考虑明确地实现接口成员来隐藏成员并添加一个名称更好的等效成员。

偶尔,特定于域的名称比Dispose更合适。 例如,文件封装可能需要使用方法名称Close。 在这种情况下,实现私下处理并创建一个调用Dispose的公共Close方法。

(PS我不同意这个惯例。)


  • 偶尔一个类会有一个Dispose方法,它是接口的一部分,但实际上并不需要被调用,因为要处理的唯一资源是内存:例如,MemoryStream。
  • 正如其他人所提到的,如果类有一个与Dispose做同样事情的Close方法,可以说Dispose只需要存在来支持“using”模式,所以它也可以是明确的。

  • 这对我来说也有点奇怪。 对于它的价值:基类(WebResponse)实现一个Close()方法。 反射器显示WebResponse的Dispose()方法只调用Close()和一个不执行任何操作的Internal OnDispose虚拟。

    我不得不承认,它对我来说有点味道,但我敢打赌,他们明确实施了IDisposable,以便在Intellisense中调用Close()或Dispose()之间不会出现混淆。

    链接地址: http://www.djcxy.com/p/54513.html

    上一篇: Why would a class implement IDisposable explicitly instead of implicitly?

    下一篇: Dispose vs Dispose(bool)