17

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

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

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

4

4 回答 4

5
  • 有时,一个类会有一个 Dispose 方法,它是接口的一部分,但实际上不需要调用,因为唯一要释放的资源是内存:例如 MemoryStream。
  • 正如其他人所提到的,如果该类具有与 Dispose 执行相同操作的 Close 方法,则可以说 Dispose 只需要存在以支持“使用”模式,因此它也可以是显式的。
于 2010-06-25T16:02:17.653 回答
1

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

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

比这个:

var response = GetResponse();

// do something

((IDisposable)response).Dispose();

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

于 2010-06-25T15:54:00.437 回答
1

我也觉得有点奇怪。值得一提的是:基类 (WebResponse) 实现了 Close() 方法。Reflector 显示 WebResponse 的 Dispose() 方法只调用 Close() 和一个不执行任何操作的 Internal OnDispose virtual。

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

于 2010-06-25T15:44:47.887 回答