一直困扰着我的.NET的一个领域正是实现IDisposable模式的时候。
我使用WSDL创建了一个SOAP Web服务代理,它在Component基类上实现了IDisposable:
public partial class WSDLGeneratedProxy : System.Web.Services.Protocols.SoapHttpClientProtocol
我已经使用简化的方法创建了sort-of facade接口,这样我就可以隐藏服务代理交互,并使其实现IDisposable:
public interface IServiceClient : IDisposable
我有一个IServiceClient的实现,该实现包含WSDLGeneratedProxy的实际成员
public class FacadeServiceClient : IServiceClient
{
private WSDLGeneratedProxy clientProxy;
}
所以我的问题是 - 我应该明确地在服务代理上调用Dispose方法吗?这是正确的方法吗?
public void Dispose()
{
this.Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (disposing)
{
if (clientProxy != null)
{
clientProxy.Dispose();
}
}
}
非常感谢任何建议或意见。
答案 0 :(得分:-1)
我没有看到你必须处理该对象的任何原因,当它不再使用时,它将被垃圾收集。
IDisposable接口基础用途是处理非托管对象(检查Proper use of the IDisposable interface)
这就是为什么我们将using
用于例如FileStream
using (var fs = new FileStream(filePath, mode))
{
//use fs
}
当编译器遇到using
关键字时,它会将代码重写为
FileStream fs = new FileStream(filePath, mode);
try
{
//use fs
}
finally
{
//compiler will automatically call dispose on the FileStream to free up unmanaged objects
fs.Dispose();
}
您可能还希望在处理内存中的大型对象(例如数百MB)时使用dispose,并且不希望等待GC收集它们,而是提前执行它。
如果您没有遇到上述任何一种情况,那么GC肯定会在处理对象方面做得比您做的更好。