我有一个关于这个领域的课程:
private WcfChannelFactory<IPrestoService> _channelFactory;
在Dispose()
方法中,我这样做:
if (_channelFactory != null) { _channelFactory.Dispose(); }
但这会产生错误:
无法访问IDisposable.Dispose
的显式实现
做了一些research之后,似乎我可以这样处理:
if (_channelFactory != null) { (_channelFactory as IDisposable).Dispose(); }
我不明白两件事:
为什么Dispose()
不可用? WcfChannelFactory<T>
派生自ChannelFactory<T>
,其源自ChannelFactory
,其实现IDisposable
。但是ChannelFactory
没有Dispose()
方法。这怎么可能?
如果我可以(应该?)只需在Close()
上调用_channelFactory
,为什么XML文档没有说明Close()
也会调用Dispose()
?也许不会?这令人困惑。
答案 0 :(得分:7)
由于Dispose
接口的IDisposable
方法实现明确,因此只有在引用类型IDisposable
时才能看到该方法。方法就在那里,但是当你有一个不同类型的引用时,你看不到它。它类似于私有方法只能从类本身的代码中看到,尽管它始终存在。
Close
方法不会为此课程调用Dispose
。该方法不关闭工厂,它启动异步关闭过程。当Close
方法退出时,关闭过程没有完成,因此当时无法处理该对象。
答案 1 :(得分:2)
Dispose
方法是作为接口IDisposable
的显式成员实现的。也就是说,定义看起来像这样:
public class WcfChannelFactory<T> : IDisposable
{
public void IDisposable.Dispose()
{
...
}
}