答案 0 :(得分:7)
垃圾收集器和终结器/析构函数是内在链接的 - 但是,大多数对象不需要(也没有)析构函数。它们在托管代码中实际上非常罕见,通常用于确保释放非托管资源。如果一个对象有一个析构函数/终结器,垃圾收集器会在收集的同时调用它(可能在下一个传递中)。垃圾收集是非确定性的 - 它发生时会发生 - 通常与记忆压力有关。
然而,更常见的是IDisposable。这允许更可预测的模式来释放资源现在(而不是在下一次发生GC时)。通常,具有终结器的类也是IDisposable,Dispose()实现禁用析构函数(如果我们已经清理了则不需要它)。请注意,Dispose()与垃圾收集无关,但通过“using”语句提供语言支持。
IDisposable
答案 1 :(得分:6)
析构函数是一个特殊的成员函数,在销毁对象时调用它。这是一个类运行的最后一个方法。
垃圾收集器是框架的一部分,自动管理内存,并且不确定地收集未引用的对象以避免内存泄漏。
答案 2 :(得分:3)
垃圾收集器是.NET环境的一部分,它跟踪对象并确保在不再需要对象时从内存中删除它们。
析构函数是类设计的一部分。它与构造函数相反。当你声明它时,GC会在它破坏一个物体时调用它。
答案 3 :(得分:0)
垃圾收集器主要通过将它可以找到的所有对象复制到RAM的新部分,然后核对旧区域来工作;它既不知道也不关心是否留下五个或五十万件物品。请注意,除了查找实时强引用引用的所有对象之外,垃圾收集器还可以找到一些其他对象,包括覆盖Finalize
的对象,用作监视器锁的对象,WeakReference对象所针对的对象等。在从轨道上挖掘旧区域之前,垃圾收集器必须处理它可能仍然坐在那里的任何“特殊”物体。
除此之外,垃圾收集器还有一个已注册终结器的所有对象的列表;它将检查该列表上的所有对象,以查看它们是否已被复制到新的内存区域。如果找到任何尚未存在的对象,则它们将从具有已注册终结器的对象列表中删除,并添加到应尽快运行Finalize
方法的对象列表中。对具有已注册终结器的所有对象完成此操作后,需要立即完成的对象列表上的任何对象以及这些对象保存引用的任何对象都将被复制到新区域。