在编程语言中,对象在其存在期间只能具有变量,实例化后不能对其进行修改。 因此,无法将同一存储单元分配给新值,因此需要某种自动存储管理来管理未使用的空间。 这些未使用的空间称为垃圾,有效内存管理的整个过程称为垃圾收集。

垃圾收集器的主要目的是将死对象与活动对象分离,并回收空间以供重用。 基本上,整个事情都在托管堆上起作用,托管堆只是一个内存块,垃圾回收器会定期检查堆内存以将内存分配给新对象。 有两种释放非托管资源(如文件和数据库连接)的方法:Dispose和Finalize。

本文可帮助您了解两者之间的区别。

Dispose和Finalize

什么是Dispose方法?

Dispose是用户告诉对象释放其资源而不再尝试再次访问对象的一种标准方法。 dispose方法通过使对象不可用来提供对显式内存清理的控制。

当用户调用Dispose()方法时,该对象应该释放其所有昂贵的资源,从而使其可以重用。 垃圾收集器从不调用它,仅当托管内存变得稀缺时才起作用。 一个特殊的接口称为“IDisposable”,用于决定在何处以及如何实现Dispose()。 但是,当未调用dispose方法时会发生什么呢?

Dispose

什么是Finalize方法?

如果未调用dispose方法,则后备计划是使用Finalize()方法进行清理。垃圾收集器调用它在释放内存之前执行最终的资源清理。及时清除的概念在这里变得不适用,因为对象不是立即取消分配内存,而是被添加到完成队列中,仅在以后销毁。 Finalize更像是在发生编程错误时实施的一种保护措施,并且dispose无法清理资源,在这种情况下,垃圾回收器将调用Finalize()方法以按其喜欢的顺序删除无法访问的对象。

Dispose和Finalize方法的区别

  1. Dispose和Finalize方法的基础
    调用Dispose方法可加快非托管资源的释放,例如数据库句柄,文件句柄,信号量以及操作系统分配的其他对象。调用dispose方法以执行清除未使用的内存和GDI句柄等稀缺资源所需的代码。简而言之,dispose方法提供对显式内存清理的控制。另一方面,Finalize方法是垃圾回收的一部分,用于在对象被垃圾回收之前对其执行最终清理操作。简而言之,调用finalize方法可在对象销毁之前释放对象所拥有的非托管资源。

  2. 调用Dispose和Finalize方法
    Dispose方法可以由用户代码和实现该方法以分配资源的类显式调用。但是,直到垃圾回收器执行清理过程后才能释放内存。即使仍然存在对该对象的其他引用,也可以调用该方法。相反,只有在垃圾回收器确定最后一个内存对象实例已销毁并且不再存在对该对象的引用之后,才能调用finalize方法。执行finalize方法后,将从堆内存中删除该对象。

  3. Dispose和Finalize方法的实现
    从内存中释放对象的过程称为释放模式,该模式可用于访问非托管资源的对象,因为垃圾回收器无法回收非托管资源。实现了“ IDisposable”接口以及其他的Dispose(布尔)方法,以请求释放非托管资源。当对象实例在释放之前被销毁时,将执行finalize方法。这是一种不确定的方法,由垃圾回收器自行决定,甚至可能不会发生。除非非常必要,否则不应在托管对象上实现它。

  4. Dispose和Finalize方法的执行
    使用dispose方法要比立即完成对象的处理要快得多。析构函数在运行时会自动转换为finalize方法。当对象超出范围时,垃圾收集器会自动调用它,通常是在销毁该对象的实例时发生。 finalize方法的问题在于它是不确定性的,这意味着不确定何时回收不再通过垃圾回收引用的内存。但是,它可能不会立即释放内存。实际上,它可能永远不会被调用,也不能明确地被强制。

总结

dispose和finalize方法之间的主要区别在于,前者是一种确定性方法,当不再使用对象时立即处置它们,而后者是用于分配非托管资源的非确定性方法,这意味着它是释放资源的一种后备方法。 内存对象实例在其释放之前超出范围时。 除非极有必要,否则始终建议在最终完成时使用dispose方法。

当在某些编程错误的情况下无法调用dispose方法时,finalize是一种清理非托管资源的保护措施。 当对象将被踢出堆内存时,垃圾回收器将调用Finalize方法。

欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果。
转载请注明:文章转载自 有区别网 [http://www.vsdiffer.com]
本文标题:Dispose和Finalize方法
本文链接:https://www.vsdiffer.com/vs/dispose-vs-finalize.html
免责声明:以上内容仅是站长个人看法、理解、学习笔记、总结和研究收藏。不保证其正确性,因使用而带来的风险与本站无关!如本网站内容冒犯了您的权益,请联系站长,邮箱: ,我们核实并会尽快处理。