代码之家  ›  专栏  ›  技术社区  ›  open-collar

入围者是干什么的?

  •  8
  • open-collar  · 技术社区  · 17 年前

    我已经在.NET中编程四年了(大部分是C#),我广泛使用IDiposable,但我还没有找到一个最终确定者的需求。入围者是干什么的?

    5 回复  |  直到 17 年前
        1
  •  11
  •   Marc Gravell    17 年前

    终结器是确保正确清理某些内容的最后一次尝试,通常保留给包裹的对象 非受管的 不会回收垃圾的资源,如非托管句柄等。

    编写终结器确实很少见。幸运的是(而且不像 IDisposable ClassA ClassB 哪包 甲级 然后 不需要终结器,但很可能两者都需要 甲级 和 B类 可识别

    对于托管代码, 可识别 这通常就足够了。即使您没有正确清理,托管对象最终也会被收集(假设它们已被释放)。

        2
  •  4
  •   JayMcClellan    17 年前

    终结器仅用于释放 非受管的 例如,GDI位图句柄等资源。如果不分配任何非托管资源,则不需要终结器。总的来说,碰任何东西都不是个好主意 管理 对象,因为无法保证终结顺序。

    使用终结器的另一种有用技术是断言在需要应用程序调用Dispose时调用了Dispose。这有助于捕获调试生成中的编码错误:

    void Dispose()
    {
      GC.SuppressFinalize(this);
    }
    #if DEBUG
    ~MyClass()
    {
      Debug.Fail("Dispose was not called.");
    }
    #endif
    
        3
  •  2
  •   Mehrdad Afshari    17 年前

    终结器是一种释放不受垃圾收集器控制的资源的机制,如非托管句柄。虽然 Dispose 可能会这样做,但不能保证消费者会打电话给它。

        4
  •  1
  •   Jason Coyne    17 年前

    终结器用于清理未处置的资源。

        5
  •  1
  •   annakata    17 年前

    维基百科 says :

    …终结器是一段 当获取的资源。。。 拥有的对象已成为垃圾 收集]

    MS本身建议您在实现者中编写类似的内容:

        public void Dispose()
        {
            this.Dispose(true);
        }
    
        protected virtual void Dispose(bool disposing)
        {
            if (!this.isDisposed)
            {
                if (disposing)
                {
                    GC.SuppressFinalize(this);
                }
            }
            //Dispose of resources here
            this.isDisposed = true;
        }
    
        ~DisposableSafe()
        {
            this.Dispose(false);
        }
    
        private bool isDisposed = false;
    

    就我个人而言,我无法忍受复制粘贴,所以我倾向于将其包装在一个抽象类中以供重用。