Финализаторы с Dispose () в C # - PullRequest
4 голосов
/ 16 ноября 2010

См. Пример кода из MSDN: (http://msdn.microsoft.com/en-us/library/b1yfkh5e(v=VS.100).aspx)

// Design pattern for a base class.
public class Base: IDisposable
{
  private bool disposed = false;

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

  protected virtual void Dispose(bool disposing)
  {
      if (!disposed)
      {
          if (disposing)
          {
              // Free other state (managed objects).
          }
          // Free your own state (unmanaged objects).
          // Set large fields to null.
          disposed = true;
      }
  }

  // Use C# destructor syntax for finalization code.
  ~Base()
  {
      // Simply call Dispose(false).
      Dispose (false);
  }
}

В реализации Dispose () он вызывает GC.SupressFinalize ();, но предоставляет деструктор для завершения объекта.

Какой смысл предоставлять реализацию для деструктора, когда вызывается GC.SuppressFinalize ()?

Просто немного запутался, каковы намерения?

Ответы [ 2 ]

6 голосов
/ 16 ноября 2010

Существует 2 сценария:

  • Ваш код вызывает Dispose (предпочтительно), и финализатор отменяется, что исключает накладные расходы.
  • Ваш код «утечка» объекта и GCвызывает финализатор.
6 голосов
/ 16 ноября 2010

Если кто-то забудет вызвать Dispose, финализатор (в конце концов) запустит окончательную очистку.Поскольку финализация ухудшает производительность, в идеале никто не забудет избавиться.Конструкция using немного помогает в этом.

...