明确实现IDisposable

时间:2011-04-07 07:07:28

标签: c# .net idisposable explicit-interface

虽然在SO上找到IDisposable的Q& As很多,但我还没有找到答案:

我通常遵循这样的做法:当我的一个类拥有一个IDisposable对象时,它也会实现IDisposable并在拥有的对象上调用Dispose。但是最近我遇到了一个明确实现IDisposable的课程,因此阻止我直接调用Dispose强迫我投出它,我觉得这很烦人且没必要。

所以问题:为什么以及何时想要使用IDisposable的显式接口实现?我知道明确地实现接口有完美的正当理由,但就IDisposable而言,原因对我来说并不十分清楚。

3 个答案:

答案 0 :(得分:15)

除非你有另一种等效方法(例如,关闭),否则明确实施IDisposable.Dispose是不寻常的。

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

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

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

  

虽然using块可以使用具有显式IDisposable实现的类,但我建议类永远不会以这种方式实现接口。如果您明确实现了IDisposable,那么在VisualStudio®中使用IntelliSense®探索对象模型的开发人员将不会注意到该对象具有Dispose方法

答案 1 :(得分:1)

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

using (ClassWithIDisposable) {
}

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

同样,当使用像城堡和统一这样的IOC框架时,你最终必须继承IDisposable到你的界面,这样就可以调用它。这些框架允许使用AOP,因此您没有仅使用接口来引用实体类......

答案 2 :(得分:1)

恕我直言,只有一个正确的理由让一个类明确地实现IDisposable,如果预计没有人真正必须调用它。一个类显式实现IDisposable的事实可以被视为一个指示器,可以安全地创建该特定类的对象,虽然不一定是派生类的对象,并且当一个是完成它。在特定类上缺少直接可用的Dispose方法可以被视为一个指示器,不需要在已知属于该特定类的对象上调用Dispose。

请注意,拥有和使用对实现IDisposable的对象的引用,而不是意识到它,不是问题;然而,获得这样一个对象的所有权。一个工厂方法,其返回类型不对IDisposable.Dispose执行任何操作并显式实现它,但有时会返回一个期望正确处置的对象,这将是泄漏的处方。如果类可以用作此类工厂方法的返回类型,则不应显式实现IDisposable。

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