一尘不染

GC,Finalize()和Dispose之间是什么关系?

c#

GC用于托管对象,而Finalize用于非托管对象,这就是我一直在阅读的内容。我一直在阅读Dispose是隐式的,而Finalize是Explicit的。有人可以给我一个例子的例子,其中出于不同的原因使用了全部三件事吗?


阅读 420

收藏
2020-05-19

共1个答案

一尘不染

GC是垃圾回收。它是自动内存管理,用于处理托管堆上分配的对象的清除。.NET
GC使用标记和清除算法。发生垃圾收集时,它基本上将堆中要清除的所有对象视为可恢复。然后,它经过标记过程,在其中扫描根。即,它标识应用程序仍在使用的对象。完成后,其余对象就有资格进行清理。堆可以作为清理的一部分进行压缩。

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

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

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

Dispose()允许确定性地清理资源,而终结器可以作为安全网,以防用户不打电话Dispose()

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

如果您想深入研究这一点,我建议使用Jeffrey
Richter的C#进行CLR
。这是一本很棒的书,它涵盖了本书的所有细节(我省略了许多细节)。新的第三版刚刚发布。

2020-05-19