GC,Finalize()和Dispose有什么关系?GC用于托管对象,Finalize用于非托管对象,这就是我一直在阅读的内容。Dispose是隐式的,Finalize是Explicit是我一直在阅读的内容。有人可以给我一个模块的例子,其中所有三个东西都用于不同的原因吗?GC是垃圾收集。它是自动内存管理,负责处理托管堆上分配的对象的清理。.NETGC使用标记清除算法。当垃圾收集发生时,它基本上将其清理的堆部分中的所有对象视为可恢复的。然后它通过标记过程来扫描根。也就是说,它标识应用程序仍在使用的对象。完成后,剩余的对象有资格进行清理。堆可以作为清理的一部分进行压缩。Dispose和finalizer方法都提供了清理GC未处理的资源的选项。例如,这可能是本机句柄等。它们与回收托管堆上的内存无关。必须在实现IDisposable的类型上显式调用Dispose。它可以通过Dispose()方法本身或通过using构造调用。GC不会自动调用Dispose。另一方面,终结器或析构器(如语言规范所称)将在对象符合清理条件后的某个时间自动调用。Finalize方法在专用线程上按顺序执行。Dispose()允许确定性地清理资源,而终结器可以在用户不调用Dispose()的情况下充当安全网。如果该类型实现了终结器,则实例的清理会延迟,因为必须在清理之前调用终结器。也就是说,它需要一个额外的集合来为该类型的实例回收内存。如果该类型还实现了IDisposable,则可以调用Dispose方法,并且该实例可以将自身从终结中移除。这将允许对象被清理,就好像它没有终结器一样。如果您想更深入地研究这一点,我推荐JeffreyRichter的TheCLRviaC#。这是一本很棒的书,它涵盖了所有血淋淋的细节(其中一些我遗漏了)。新的第3版刚刚发布。.NET的优点之一是垃圾收集器。在许多语言中,每一块内存都必须由开发人员管理——任何分配的内存最终都应该被释放。在.NET(C#)中,垃圾收集器(GC)将负责为您释放内存的过程。它跟踪对象的使用情况,当它们变得“无根”(即:应用程序中没有引用直接或间接引用该对象)后,对象的内存将自动清除。Dispose,或者更具体地说,IDisposable和Dispose模式用于与GC分开处理资源。由于各种原因,某些资源需要明确清理。这包括使用“本机”API(其中.NET不知道分配的内存)、使用包装本机句柄的资源等。要干净地处理它,您可以实现IDisposable和Dispose模式。当一个对象即将被垃圾收集时,终结发生在一个对象上。这提供了一个“安全网”,即使晚于理想情况,仍然可以清洁应该处理的物体。通过实施终结器,您可以保证始终释放非托管资源。大多数示例的问题在于使用IDisposable的原因有多种,正确的实现取决于您使用它的原因。例如,如果直接包装本机资源,则应实现终结器,但如果包装另一个IDisposable类型,则不需要终结器,即使您仍应实现IDisposable。为了解决这个问题,我写了一篇关于IDisposable的博文并对其进行了定稿,描述了您可以使用IDisposable的许多原因,以及不同的原因。您可能只想阅读我认为是关于IDisposable、终结器和垃圾回收的权威文章,CLRInsideOut:ShawnFarkas撰写的深入研究IDisposable。这篇文章对这个主题没有任何疑问。以上就是C#学习教程:GC、Finalize()、Dispose是什么关系?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
