【问题标题】:Garbage collection methods in c# applicationc#应用程序中的垃圾收集方法
【发布时间】:2015-05-12 21:37:35
【问题描述】:

我有这个问题:

我不明白为什么第二个choice 是答案。我的意思是其他方法(KeepAliveCancelFullGCNotification)会阻止系统调用终结器。

  1. 这四种方法有什么区别?
  2. 在哪些情况下,我们必须使用它?

【问题讨论】:

  • KeepAlive 阻止收集,直到调用 KeepAlive 的代码行。 CancelFullGCNotification 与它无关。
  • 顺便说一句,如果您阅读您发布的链接,它会解释它们以及它们与SuppressFinalize 的不同之处。
  • PublicizeFinalize 是我最喜欢的方法。因为它不存在。
  • @Zer0 至少你可以想象它的实现:)

标签: c# .net memory-management garbage-collection


【解决方案1】:

KeepAlive 只会延迟在类上调用终结器(通过延长对象的寿命而不使其符合终结条件)并且CancelFullGCNotification 具有与最终确定无关。

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

【讨论】:

  • 重新措辞以提高清晰度
【解决方案2】:

仅当您编写了终结器时才需要使用 SuppressFinalizer。大多数时候你不需要压制。无论如何,B 是正确答案,也是防止调用析构函数/终结方法的唯一方法。

【讨论】:

    【解决方案3】:

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

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

    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);
        }
    }
    

    【讨论】:

    • 老实说,这种模式也很糟糕(即使它是来自 Microsoft 的参考模式)。您永远不应该在同一个类中拥有托管项和非托管项。如果您有非托管项目,他们应该在它们周围有托管包装器 (SafeHandles)。请参阅 Stephen Cleary 的非常好的博文“IDisposable: What Your Mother Never Told You About Resource Deallocation
    • @ScottChamberlain 这种模式没有任何问题,大量的 .NET 内部人员都在使用它。无论如何,我要说的是你很少应该有一个终结器,它会延迟垃圾收集。当你没有有非托管资源时有一个终结器是不好的。
    • @ScottChamberlain 讽刺的是,WaitHandle 类(同步的核心)使用了同样的模式。来源:public void Dispose() { Dispose(true); GC.SuppressFinalize(this); }
    猜你喜欢
    • 2015-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-12
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    相关资源
    最近更新 更多