C# c应用程序中的垃圾收集方法

C# c应用程序中的垃圾收集方法,c#,.net,memory-management,garbage-collection,C#,.net,Memory Management,Garbage Collection,我有一个问题: 我不明白为什么第二个是答案。我指的是其他方法,它会阻止系统调用终结器 这四种方法的区别是什么? 在哪些情况下,我们必须使用它? KeepAlive只会延迟类上调用的终结器,因为它会延长对象的生存时间,并且不会使对象符合终结条件,而CancelFullGCNotification与终结无关 只有SuppressFinalize将阻止终结器在类上运行。只有在对终结器进行编码后,才需要使用SuppressFinalizer。大多数情况下,您不需要抑制。无论如何,B是正确答案,也是防止调

我有一个问题:

我不明白为什么第二个是答案。我指的是其他方法,它会阻止系统调用终结器

这四种方法的区别是什么? 在哪些情况下,我们必须使用它? KeepAlive只会延迟类上调用的终结器,因为它会延长对象的生存时间,并且不会使对象符合终结条件,而CancelFullGCNotification与终结无关


只有SuppressFinalize将阻止终结器在类上运行。

只有在对终结器进行编码后,才需要使用SuppressFinalizer。大多数情况下,您不需要抑制。无论如何,B是正确答案,也是防止调用析构函数/最终确定方法的唯一方法。

更重要的是。。。终结器应该很少被使用,并且它本身会延迟垃圾收集

它用于清理非托管资源,这是通常使用的模式:

public class SomeClass : IDisposable
{
    private bool disposed;

    //disposing is true if you're disposing managed resources
    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                //Dispose managed resources
            }
            //Dispose unmanaged resources
            disposed = true;
        }
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    ~SomeClass()
    {
        Dispose(false);
    }
}

KeepAlive在调用KeepAlive的代码行之前阻止收集。CancelFullGCNotification与此无关。顺便说一句,如果你阅读了你发布的链接,它会解释这两个链接以及它们与SuppressFinalize的区别。PublicationFinalize是我最喜欢的方法。因为它不存在。@Zer0至少你可以想象它的实现:为了更好的清晰度而重新编写老实说,这种模式也很糟糕,即使它是微软的参考模式。您不应该在同一个类中有托管项和非托管项。如果您有非托管项,它们周围应该有托管包装器。请参阅Stephen Cleary@ScottChamberlain撰写的一篇非常好的博客文章。这种模式没有任何问题,大量.NET内部人员都在使用它。无论如何,我要说的是,你很少应该有一个终结器,它会延迟垃圾收集。而在没有非托管资源的情况下使用终结器是不好的。@ScottChamberlain讽刺的是,作为同步核心的WaitHandle类也使用同样的模式。来自源:public void Dispose{Disposetrue;GC.SuppressFinalizethis;}