gpt4 book ai didi

c# - GC、Finalize() 和 Dispose 之间的关系是什么?

转载 作者:IT王子 更新时间:2023-10-29 04:33:01 25 4
gpt4 key购买 nike

GC 用于托管对象,Finalize 用于非托管对象,这就是我一直在阅读的内容。 Dispose 是隐式的,Finalize 是 Explicit 是我一直在阅读的内容。有人可以给我一个模块的示例吗,其中出于不同原因使用了所有这三种东西?

最佳答案

GC 是垃圾回收。它是自动内存管理,负责处理托管堆上分配的对象的清理。 .NET GC 采用标记清除算法。当发生垃圾回收时,它基本上认为要清理的堆部分中的所有对象都是可恢复的。然后它会经历一个标记过程,在这个过程中它会扫描根。 IE。它标识应用程序仍在使用的对象。完成后,剩余的对象有资格进行清理。作为清理的一部分,堆可能会被压缩。

Dispose 和 finalizer 方法都提供了清理资源的选项,这些资源由 GC 处理。例如。这可能是 native 句柄等。它们与回收托管堆上的内存无关。

必须在实现 IDisposable 的类型上显式调用 Dispose。它可以通过 Dispose() 方法本身或通过 using 构造来调用。 GC 不会自动调用 Dispose。

另一方面,终结器或析构器(如语言规范所称)将在对象符合清理条件后某个时间自动调用。 Finalize 方法在专用线程上按顺序执行。

Dispose() 允许确定性地清理资源,而终结器可以充当安全网以防用户未调用 Dispose()

如果一个类型实现了终结器,则实例的清理会延迟,因为必须在清理之前调用终结器。 IE。它将需要额外的收集来为该类型的实例回收内存。如果该类型也实现了 IDisposable,则可以调用 Dispose 方法,然后实例可以将自身从终结中移除。这将允许清理对象,就好像它没有终结器一样。

如果你想深究这个,我推荐CLR via C# by Jeffrey Richter .这是一本很棒的书,涵盖了所有细节(我遗漏了一些细节)。新的第 3 版刚刚发布。

关于c# - GC、Finalize() 和 Dispose 之间的关系是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2344240/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com