我需要在一个静态对象上调用Dispose()方法吗?

4
如果我有一个静态的WebClient对象,在Main()结束时需要调用Dispose()吗?

更好的解决方案将是_不使用_静态IDisposables。 - H H
1
请注意,WebClient 不是线程安全的。如果您将其用于 static 字段中,则存在很多不当使用的机会。 - Marc Gravell
2个回答

5

不管对象放在哪里,使用完毕后应始终调用Dispose()方法进行释放。

如果对象被放在静态字段中,可能会更加困难来判断何时完成了对该对象的使用。


1
除了一个好的经验法则之外,为什么要说“总是处理”?在这种特定情况下,有什么具体的理由需要处理吗?这个进程不会被从内存中删除吗? - Kent Boogaart
@Kent:我们不知道WebClient.Dispose的作用。 - SLaks
2
我检查过了,它实际上并没有做任何事情。不过通常情况下,你应该总是要处理(dispose)的。 - SLaks
2
@Kent Boogaart:Dispose 的目的不是销毁一个对象,而是允许对象清理外部实体(这些实体甚至可能不在同一台计算机上!),以便可以安全地放弃它。 - supercat
@supercat:在这种情况下,相关类型应包括终结器以确保远程资源得到清理。Dispose仅用于确定性清理。 - Kent Boogaart
显示剩余2条评论

2
作为一般规则,您应该处理任何一次性对象。这将允许清理任何资源。然而,并没有保证可处理类型上调用dispose - 消费者可能忽略调用它,CLR不会自动调用它。
如果类型真的需要执行其清理逻辑(例如在分配非托管内存或在文件系统上创建文件堆时),它应该与处理模式一起实现终结器。如果尚未调用终结器(通常是通过处置对象完成),CLR将在进程退出时调用终结器。是的,关于此有一些警告(例如,错误的终结器可能破坏其他可终结实例的进程),但CLR保证至少尝试在进程退出时运行所有终结器。
因此,在技术上,在这种情况下,我认为您绝对不必调用处理方法。然而,养成好习惯也是不错的。

我并没有假设那样。我只是认为WebClient不需要它。也就是说,特定情况并不需要它。如果类型依赖于其清理逻辑来执行,那么它不应该包括终结器吗? - Kent Boogaart
1
操作系统会删除临时文件。如果用户足够聪明,使用正确的方法创建它们的话 ;) - TomTom
@Centro:无法保证终结器会运行。http://blogs.msdn.com/b/oldnewthing/archive/2010/08/09/10047586.aspx - SLaks
@TomTom,有什么神奇的函数可以保证无论进程如何终止都能清除临时文件吗?我问这个问题是因为我想开始使用它! - David Heffernan
@David:我相信是 FILE_ATTRIBUTE_TEMPORARY - SLaks
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接