14

尽管在 SO 上可以找到很多问答IDisposable,但我还没有找到答案:

我通常遵循这样的做法,即当我的一个类拥有一个IDisposable对象时,它也会实现IDisposable并调用Dispose所拥有的对象。然而最近我遇到了一个IDisposable明确实现的类,从而阻止我直接调用Dispose强迫我强制转换它,我觉得这很烦人且不必要。

所以问题是:为什么以及何时要使用 的显式接口实现IDisposable?我知道明确实现接口有完全好的和正当的理由,但关于IDisposable原因对我来说不是很清楚。

4

3 回答 3

16

IDisposable.Dispose我会说除非你有一个替代的等效方法(例如关闭) ,否则有一个明确的实现是不寻常的。

在这种情况下,您的包装类可以调用 Close 而不是强制转换。

例如WebResponse,Framework <= V3.5 中的类。有趣的是,.NET 4 中有一个公共的 Dispose 方法,所以也许微软现在已经决定显式实现可能不是好的做法。

CLR 安全团队的设计工程师 Shawn Farkas 在MSDN 杂志上写道

尽管 using 块将与具有显式 IDisposable 实现的类一起使用,但我建议类永远不要以这种方式实现接口。如果显式实现 IDisposable,在 Visual Studio® 中使用 IntelliSense® 探索对象模型的开发人员将不会注意到对象具有 Dispose 方法

于 2011-04-07T07:12:14.737 回答
1

我会说这是一个很好的做法,它强制(除非你想强制转换为 IDisposable !!)使用 using

using (ClassWithIDisposable) {
}

即使发生异常,也会调用 Dispose

此外,当使用 Castle 和 unity 等 IOC 框架时,您最终必须将 IDisposable 继承到您的接口,以便可以调用它。这些框架允许 AOP,因此您没有对实体类的引用,只有一个接口......

于 2011-04-07T07:20:56.630 回答
1

恕我直言,一个类显式实现 IDisposable 只有一个适当的理由,那就是如果预计没有人真正需要调用它。一个类显式实现 IDisposable 的事实可以被视为一个指标,表明人们可以安全地创建该特定类的对象,尽管不一定是派生类的对象,并且在完成后简单地放弃它。特定类缺少直接可用的 Dispose 方法可以被视为不需要对已知属于该特定类的对象调用 Dispose 的指示。

请注意,拥有和使用对实现 IDisposable 的对象的引用,而没有意识到它确实存在,这不是问题;然而,获得这样一个对象的所有权是。其返回类型与 IDisposable.Dispose 无关并显式实现它的工厂方法,但有时会返回一个期望正确 Disposal 的对象,这将是泄漏的秘诀。如果一个类可以用作此类工厂方法的返回类型,则该类不应显式实现 IDisposable。

就个人而言,我倾向于处理所有实现 IDisposable 的对象,无论它们是否需要。尽管如此,知道某些特定类型的 IDisposable 对象在确保正确处置否则会很困难或尴尬的情况下可能非常有用。

于 2011-04-16T19:18:23.367 回答