2013-05-08 57 views
6

我有这个领域类:为什么Dispose()方法在我的IDisposable对象上不可用?

private WcfChannelFactory<IPrestoService> _channelFactory; 

Dispose()方法,我这样做:

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

但是,这会产生一个错误:

Cannot access explicit implementation of IDisposable.Dispose

后做一些research,看来我可以这样配置:

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

我不明白两两件事:

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

  2. 如果我可以(应该?)简单地调用_channelFactoryClose(),为什么不XML文档状态Close()会也呼吁Dispose()?也许它不会?这很混乱。

回答

7
  1. 作为Dispose方法被实现explicilty为IDisposable接口,你只能看到该方法时,你有类型IDisposable的参考。方法就在那里,但是当你有一个不同类型的引用时你看不到它。它类似于私有方法只能从类本身的代码中看到,尽管它始终存在。

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

+0

所以我怎么处置_channelFactory'的'?我应该调用'Close()'吗?我应该叫'Dispose()'? – 2013-05-08 01:52:54

+0

@鲍勃,没关系。误解你原来的问题。看起来你正在实现你自己的一次性模式。 – 2013-05-08 01:53:39

+0

@AnthonyPegram我不能。该方法返回'_channelFactory'。消费者正在使用'使用'来封装这个调用,所以我们的课程需要实现'IDiposable'并添加它。 – 2013-05-08 01:55:11

2

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

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

教程:Explicit Interface Implementation Tutorial

+0

我知道明确的接口实现是什么。谢谢! – 2013-05-08 01:55:41

相关问题