C# IDispose对象是否可以没有可用的Dispose方法

C# IDispose对象是否可以没有可用的Dispose方法,c#,idisposable,filehelpers,C#,Idisposable,Filehelpers,我在一个项目中使用了类MultiRecordEngine public sealed class MultiRecordEngine : EventEngineBase<object>, IEnumerable, IDisposable 检查后,我可以看到在这里显式实现的方法,第913行: void IDisposable.Dispose() { Close(); GC.SuppressFinalize(this); } 所以为什么我不能调用该方法?这是有

我在一个项目中使用了类
MultiRecordEngine

public sealed class MultiRecordEngine
    : EventEngineBase<object>, IEnumerable, IDisposable
检查后,我可以看到在这里显式实现的方法,第913行:

void IDisposable.Dispose()
{
    Close();
    GC.SuppressFinalize(this);
}

所以为什么我不能调用该方法?这是有意的吗?如果是,这是一种好的做法吗?在什么情况下?

它是明确实现的,因此您需要强制转换到
IDisposable

((IDisposable)eng).Dispose();
((IDisposable)eng).Dispose();

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

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

((IDisposable)eng).Dispose();
((IDisposable)eng).Dispose();
您还可以在using块中正确使用该类:

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

我为自己感到羞耻。我一直认为显式实现在客户端代码中没有效果。感谢就像背后的疼痛,而且是违反直觉的。我想听听是否有人能为显式实现IDisposable.提供一些好处。类似的问题:和@hatchet一个可能的原因是Dispose()整理Intellisense列表很好,它99%的时间不会被直接调用。@KeithPayne-除了Dispose()之外出现在Intellisense列表中可能是让程序员意识到它是需要处理的东西所需要的提示。如果它没有出现,他们可能会认为它没有实现IDisposable。@hatchet:显式实现有意义的主要情况是,类实现了一个接口,该接口实现了
IDisposable
(例如
IEnumerator
),但
Dispose
方法什么都不做。Microsoft建议使用名为
Close
Shutdown
等方法的东西可以显式地实现
Dispose
,以表明它与其他方法是多余的,但我真的不喜欢这种模式,因为没有任何迹象表明什么方法可以替代
Dispose
(某些类可能在
关闭后保留资源,以允许重新打开)。