c# – 当我们没有析构函数时,为什么要调用SuppressFinalize?

我有几个问题,我无法得到一个正确的答案。

1)当我们没有析构函数时,为什么要在Dispose函数中调用SuppressFinalize。

2)处理和完成在对象被垃圾回收之前用于释放资源。无论是受管理的还是非托管资源,我们需要释放它,那么为什么我们需要在dispose函数内部的一个条件,当我们从IDisposable调用这个被覆盖的函数时,传递’true’:从finalize调用时,Dispose并传递false。

请看下面我从网复制的代码。

class Test : IDisposable
   {
     private bool isDisposed = false;

     ~Test()
     {
       Dispose(false);
     }

     protected void Dispose(bool disposing)
     {
       if (disposing)
       {
         // Code to dispose the managed resources of the class
       }
       // Code to dispose the un-managed resources of the class

       isDisposed = true;
     }

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

如果我删除布尔保护的Dispose函数并实现如下。

   class Test : IDisposable
   {
     private bool isDisposed = false;

     ~Test()
     {
       Dispose();
     }


     public void Dispose()
     {
      // Code to dispose the managed resources of the class
      // Code to dispose the un-managed resources of the class
      isDisposed = true;

      // Call this since we have a destructor . what if , if we don't have one 
       GC.SuppressFinalize(this);
     }
   }       
我在这里待了一个肢体,但大多数人不需要全面的配置模式。面向可直接访问非托管资源(通常通过IntPtr)和面向继承而设计的是坚实的。大多数时候,这些都不是实际需要的。

如果你只是提到实现IDisposable的其他东西,你几乎肯定不需要一个终结者 – 无论持有资源直接负责处理这个。你可以这样做:

public sealed class Foo : IDisposable
{
    private bool disposed;
    private FileStream stream;

    // Other code

    public void Dispose()
    {
        if (disposed)
        {
            return;
        }
        stream.Dispose();
        disposed = true;
    }
}

请注意,这不是线程安全的,但这可能不会是一个问题。

通过不必担心子类直接持有资源的可能性,您不需要限制终结器(因为没有一个) – 并且您不需要提供定制处理的子类的方法。人生更简单,没有遗产。

如果你确实需要允许不受控制的继承(即你不愿意赌这个子类会有非常特殊的需求),那么你需要去完整的模式。

请注意,使用.NET 2.0中的SafeHandle,甚至比.NET 1.1中需要自己的终结器更简单。

为了解释你为什么首先有一个处理标志:如果你在一个终结者中运行,你引用的其他对象可能已经被定稿了。你应该让他们自己清理,你应该只清理你直接拥有的资源。

http://stackoverflow.com/questions/2605412/why-should-we-call-suppressfinalize-when-we-dont-have-a-destructor

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:c# – 当我们没有析构函数时,为什么要调用SuppressFinalize?