为什么一个类显式实现IDisposable而不是隐式?

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

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

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

如果类具有与Dispose完全相同的Close方法,则通常会执行此操作。 原始Dispose隐藏在显式实现中,因此完全相同的方法没有两个名称。

这是官方推荐的:

如果此类术语是标准术语,请实现Close方法以进行清理,例如与文件或套接字一样。 这样做时,建议您将Close实现与Dispose相同…

考虑显式实现接口成员以隐藏成员并添加具有更好名称的等效成员。

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

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

  • 有时,类会有一个Dispose方法,它是接口的一部分,但实际上并不需要调用,因为唯一要处理的资源是memory:MemoryStream,例如。
  • 正如其他人所提到的,如果类具有与Dispose相同的Close方法,可以说Dispose只需要存在以支持“使用”模式,因此它也可以是显式的。

看起来对我来说有点奇怪。 值得一提的是:基类(WebResponse)实现了Close()方法。 Reflector显示WebResponse的Dispose()方法只调用Close()和一个不执行任何操作的内部OnDispose虚拟。

我必须承认它对我来说有点味道,但我敢打赌他们明确地实现了IDisposable,这样在调用Close()或Dispose()之间Intellisense就不会混淆了。

除了已经说过的内容之外,我可能会建议实现IDisposable明确鼓励使用using块,因为它可以用于任何实现IDisposable类型,并且更自然地(对大多数人来说,无论如何)写这个:

 using (var response = GetResponse()) { // do something } 

比这个:

 var response = GetResponse(); // do something ((IDisposable)response).Dispose(); 

我不确定这是开发人员明确实现IDisposable的意图,但它是可能的。