2014-01-26 81 views
0

我玩弄今天System.Net.HttpListenerResponse,我注意到仍有顯然是在我的知識有關using差距。爲什麼我可以使用,但不是object.dispose()?

using (HttpListenerResponse response = context.Response) 
{ 
    // Do stuff 
} 

是完全有效的代碼,但是,該對象沒有Dispose()方法。

爲什麼using還能用嗎?

回答

5

IDisposable.DisposeSystem.Net.HttpListenerResponse明確實施。要從您的代碼中調用它,您必須首先將其轉換爲IDisposable

HttpListenerResponse response = GetResponse(); 

// doesn't work 
response.Dispose(); 

// do work 
((IDisposable)response).Dispose(); 
+0

+1從我..很好的例子 – Nico

1

IDisposableHttpListenerResponse繼承從而使using語句來自動調用Dispose()方法時完成。

HttpListenerResponse的明確定義,如下Dispose()方法。 (取自反編譯)。

void System.IDisposable.Dispose() 
{ 
    this.Dispose(true); 
    GC.SuppressFinalize(this); 
} 
4

正如你可以在它documentation看到,HttpListenerResponse確實實現IDisposable。該接口實現明確不過,在「顯式接口實現」所列:

void IDisposable.Dispose() 

C# Interfaces. Implicit implementation versus Explicit implementation解釋說:

明確implentation它允許只有當強制轉換爲接口本身是可訪問的。

所以你必須強制轉換爲IDisposable以調用方法:

((IDisposable)response).Dispose(); 

這是appropriately documented

此API支持.NET Framework基礎結構,不打算直接從您的代碼中使用。

另請參閱Why would a class implement IDisposable explicitly instead of implicitly?

相關問題