显式实现IDisposable

虽然在SO上有很多关于IDisposable的问答,但我还没有找到答案:

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

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

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

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

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

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

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

我会说这是一个很好的做法,它强制(除非你想投射到IDisposable !!)使用

 using (ClassWithIDisposable) { } 

即使发生exception,也会调用Dispose

此外,当使用像城堡和统一这样的IOC框架时,您最终必须inheritanceIDisposable到您的界面,以便可以调用它。 这些框架允许使用AOP,因此您没有对您的实体类的引用只有一个接口……

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

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

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