【发布时间】:2011-06-30 00:53:08
【问题描述】:
以下是同事编写的一些示例代码。这对我来说显然是错误的,但我想检查一下。一个对象应该从它自己的方法之一中调用它自己的 Dispose() 方法吗?在我看来,只有对象的所有者/创建者才应该调用 Dispose() 来处理对象而不是对象本身。
这是一个 .asmx 网络方法,它在完成后会自行调用 Dispose()。 (它是一个 Web 方法这一事实可能与一般问题有关。)在我们的代码库中,我们有时会在其他 Web 服务的方法中实例化 Web 服务类,然后在它们上调用方法。如果我的代码这样做是为了调用这个方法,那么当方法返回时,对象就会吐司,我不能再真正使用该对象了。
[WebMethod]
public string MyWebMethod()
{
try
{
return doSomething();
}
catch(Exception exception)
{
return string.Empty;
}
finally
{
Dispose(true);
}
}
更新: 找到了一些相关的链接:
【问题讨论】:
-
让同事解释这背后的原因,我们可能会帮助您讨论为什么不这样做:D
-
@David:在某些情况下,对象是可序列化但不可克隆的;序列化实例会使它无效,并且任何序列化的表示只能反序列化一次。 TCP 套接字就是这样的。
-
@David:我不相信我的同事真的理解 Dispose 的用途。我们有一个大型对象库,并且所有类都保留一个实现 IDispose 的实用程序类的实例,以便它可以将 Dictionary 实例设置为 null!在不需要的时候一直使用 using() 是令人沮丧的。不要让我开始使用所有返回码而不是异常。当然,当我开始使用 .Net 时,我并不知道一切。 ;-)
-
向您的同事解释 IDisposable 的目的不是让对象消失,而是对对象 外部 的实体执行清理。如果对象将成为执行此类清理所需的信息和动力的最后持有者,则该对象应实现 IDisposable。一般来说,如果一个对象的 Dispose 方法不打算清理它自身之外的实体,它也可能不存在。
标签: c# .net web-services dispose idisposable