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

MCS*_*MCS 17 c# idisposable explicit-interface

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

// response is an instance of FtpWebResposne
((IDisposable) response).Dispose();
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*ary 15

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

它在这里正式推荐:

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

考虑明确地实现接口成员以隐藏成员并添加具有更好名称的等效成员.

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

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

  • 我和你分歧了.有一个非常强大的约定,一旦在对象上调用Dispose(),就不需要进行进一步的清理或可能进行(例如,应该可以再次调用Dispose而不抛出异常,但它不应该有任何效果).围绕关闭没有这样的惯例.对象完全可以支持Close方法,但是为了允许Reopen方法,不要清理所有内容. (3认同)

Qwe*_*tie 5

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