【问题标题】:Can an IDispose objects not have an available Dispose methodIDispose 对象是否可以没有可用的 Dispose 方法
【发布时间】: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&lt;T&gt;)但Dispose方法什么都不做。微软建议使用称为例如方法的东西。 CloseShutdown 等可能会显式实现 Dispose 以暗示它与其他方法是多余的,但我真的不喜欢这种模式,因为没有任何迹象表明哪些方法可以充分替代 Dispose(某些类可能在Close 之后保留资源以允许重新打开)。

标签: c# idisposable filehelpers


【解决方案1】:

它是显式实现的,所以你需要转换为IDisposable

((IDisposable)eng).Dispose();

显式实现的成员只能通过接口访问,而不是实现类。

【讨论】:

  • 为自己感到羞耻。我一直认为显式实现对客户端代码没有影响。谢谢
【解决方案2】:

首先,您可以通过转换为IDisposable来调用该方法:

((IDisposable)eng).Dispose();

您也可以在 using 块中正确使用该类:

using (MultiRecordEngine eng = new MultiRecordEngine())
{
..
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2013-05-04
    • 1970-01-01
    • 2018-01-08
    • 2013-01-23
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多