为什么我可以使用using而不是object.dispose()?

时间:2014-01-26 23:23:36

标签: c#

我今天正在玩System.Net.HttpListenerResponse,我注意到我对using的了解仍然存在差距。

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

是完全有效的代码,但是,该对象没有Dispose()方法。

为什么using仍有效?

3 个答案:

答案 0 :(得分:5)

IDisposable.Dispose已在System.Net.HttpListenerResponse中明确实施。要从代码中调用它,您必须先将其强制转换为IDisposable

HttpListenerResponse response = GetResponse();

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

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

答案 1 :(得分:4)

正如您在documentation中看到的那样,HttpListenerResponse确实实现了IDisposable。接口是明确实现的,如“显式接口实现”中所列:

void IDisposable.Dispose()

C# Interfaces. Implicit implementation versus Explicit implementation中所述:

  

显式实现允许它仅在作为接口本身进行转换时可访问。

因此,您必须将其转换为IDisposable才能调用方法:

((IDisposable)response).Dispose();

appropriately documented

  

此API支持.NET Framework基础结构,不能直接在您的代码中使用。

另见Why would a class implement IDisposable explicitly instead of implicitly?

答案 2 :(得分:1)

HttpListenerResponse继承自IDisposable,从而允许using语句在完成时自动调用Dispose()方法。

HttpListenerResponse明确定义了Dispose()方法,如下所示。 (取自反编译)。

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