【发布时间】:2013-08-20 14:59:56
【问题描述】:
我在一个项目中使用FileHelpers,类MultiRecordEngine
public sealed class MultiRecordEngine
: EventEngineBase<object>, IEnumerable, IDisposable
这个类实现了IDisposable,但是没有公共的Dispose方法...
MultiRecordEngine eng = null;
eng.Dispose(); // <---- Results in compilation error
检查this class code on GitHub我可以看到这里明确实现的方法,第913行:
void IDisposable.Dispose()
{
Close();
GC.SuppressFinalize(this);
}
那么... 为什么我不能调用该方法?这是有意的吗?如果是这样,这是一种好的做法吗?在什么情况下?
【问题讨论】:
-
似乎是后背痛,而且违反直觉。我想知道是否有人可以为显式实现 IDisposable 提供一些好处。
-
@hatchet 一个可能的原因是 Intellisense 列表被 Dispose() 整理得井井有条,这样 99% 的时间都不会被直接调用。
-
@KeithPayne - 除了 Dispose() 出现在 Intellisense 列表中可能是让程序员意识到它需要处理的东西所需的提示。如果它没有出现,他们可能只是假设它没有实现 IDisposable。
-
@hatchet:显式实现有意义的主要情况是当一个类实现一个实现
IDisposable的接口(例如IEnumerator<T>)但Dispose方法什么都不做。微软建议使用称为例如方法的东西。Close、Shutdown等可能会显式实现Dispose以暗示它与其他方法是多余的,但我真的不喜欢这种模式,因为没有任何迹象表明哪些方法可以充分替代Dispose(某些类可能在Close之后保留资源以允许重新打开)。
标签: c# idisposable filehelpers