首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Finalize vs Dispose

Finalize vs Dispose
EN

Stack Overflow用户
提问于 2009-04-09 05:00:43
回答 16查看 168K关注 0票数 246

为什么有些人使用Finalize方法而不是Dispose方法?

在什么情况下,您会使用Finalize方法而不是Dispose方法,反之亦然?

EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2009-04-09 05:14:34

其他人已经介绍了DisposeFinalize之间的区别(顺便说一句,Finalize方法在语言规范中仍然被称为析构函数),因此我将添加一些关于Finalize方法派上用场的场景。

某些类型以一种易于在单个操作中使用和处置可处置资源的方式封装可处置资源。一般用法通常是这样的:打开、读或写、关闭(Dispose)。它非常适合using构造。

其他的就有点困难了。实例的WaitEventHandles不是这样使用的,因为它们用于从一个线程向另一个线程发出信号。那么问题就变成了谁应该在这些问题上调用Dispose?作为一种保护措施,这类类型实现了一个Finalize方法,当应用程序不再引用该实例时,该方法可确保释放资源。

票数 131
EN

Stack Overflow用户

发布于 2009-04-09 05:05:34

终结器方法在您的对象被垃圾回收时调用,您不能保证何时会发生这种情况(您可以强制它,但它会损害性能)。

另一方面,Dispose方法旨在由创建您的类的代码调用,以便您可以在代码处理完您的对象时清理和释放所获取的任何资源(非托管数据、数据库连接、文件句柄等)。

标准做法是实现IDisposableDispose,以便可以在using语句中使用对象。例如using(var foo = new MyObject()) { }。在你的终结器中,你调用Dispose,以防调用代码忘记处理你。

票数 158
EN

Stack Overflow用户

发布于 2009-04-09 05:09:21

Finalize是backstop方法,由垃圾回收器在回收对象时调用。Dispose是“确定性清理”方法,由应用程序调用以释放有价值的本机资源(窗口句柄、数据库连接等)。当它们不再需要时,而不是让它们无限期地持有,直到GC转到对象。

作为对象的用户,您始终使用Dispose。Finalize是为GC准备的。

作为类的实现者,如果您持有应该释放的托管资源,则应实现Dispose。如果持有本机资源,则同时实现Dispose和Finalize,并且这两个方法都调用释放本机资源的公共方法。这些习惯用法通常通过一个私有的Dispose(bool disposing)方法组合在一起,该方法用true处理调用,用false完成调用。此方法始终释放本机资源,然后检查disposing参数,如果为真,则释放托管资源并调用GC.SuppressFinalize。

票数 72
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/732864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档