2013-05-08 104 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

相關問題