为什么我的IDisposable对象上的Dispose()方法不可用?

时间:2013-05-08 01:37:54

标签: c# dispose

我有一个关于这个领域的课程:

private WcfChannelFactory<IPrestoService> _channelFactory;

Dispose()方法中,我这样做:

if (_channelFactory != null) { _channelFactory.Dispose(); }

但这会产生错误:

  

无法访问IDisposable.Dispose

的显式实现

做了一些research之后,似乎我可以这样处理:

if (_channelFactory != null) { (_channelFactory as IDisposable).Dispose(); }

我不明白两件事:

  1. 为什么Dispose()不可用? WcfChannelFactory<T>派生自ChannelFactory<T>,其源自ChannelFactory,其实现IDisposable。但是ChannelFactory没有Dispose()方法。这怎么可能?

  2. 如果我可以(应该?)只需在Close()上调用_channelFactory,为什么XML文档没有说明Close()也会调用Dispose()?也许不会?这令人困惑。

2 个答案:

答案 0 :(得分:7)

  1. 由于Dispose接口的IDisposable方法实现明确,因此只有在引用类型IDisposable时才能看到该方法。方法就在那里,但是当你有一个不同类型的引用时,你看不到它。它类似于私有方法只能从类本身的代码中看到,尽管它始终存在。

  2. Close方法不会为此课程调用Dispose。该方法不关闭工厂,它启动异步关闭过程。当Close方法退出时,关闭过程没有完成,因此当时无法处理该对象。

答案 1 :(得分:2)

Dispose方法是作为接口IDisposable的显式成员实现的。也就是说,定义看起来像这样:

public class WcfChannelFactory<T> : IDisposable
{
    public void IDisposable.Dispose()
    {
        ...
    }
}

教程:Explicit Interface Implementation Tutorial