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

时间:2010-06-25 15:30:00

标签: c# idisposable explicit-interface

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

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

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

4 个答案:

答案 0 :(得分:15)

答案 1 :(得分:5)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

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

比这个:

var response = GetResponse();

// do something

((IDisposable)response).Dispose();

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