我今天正在玩System.Net.HttpListenerResponse
,我注意到我对using
的了解仍然存在差距。
using (HttpListenerResponse response = context.Response)
{
// Do stuff
}
是完全有效的代码,但是,该对象没有Dispose()方法。
为什么using
仍有效?
答案 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();
此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);
}