Dispose

Версия 1.5 от Alexandr Fokin на 2023/02/15 23:27

Реализация метода Dispose
https://learn.microsoft.com/ru-ru/dotnet/standard/garbage-collection/implementing-dispose


Отчистка неуправляемых и управляемых ресурсовclass BaseClassWithFinalizer : IDisposable
{
   // To detect redundant calls
   private bool _disposedValue;

    ~BaseClassWithFinalizer() => Dispose(false);

   // Public implementation of Dispose pattern callable by consumers.
   public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

   // Protected implementation of Dispose pattern.
   protected virtual void Dispose(bool disposing)
    {
       if (!_disposedValue)
        {
           if (disposing)
            {
               // TODO: dispose managed state (managed objects)
           }

           // TODO: free unmanaged resources (unmanaged objects) and override finalizer
           // TODO: set large fields to null
           _disposedValue = true;
        }
    }
}
Отчистка управляемых ресурсов
(Соответственно не использует финализацию).
public sealed class Foo : IDisposable
{
   private readonly IDisposable _disposable1;
   private readonly IDisposable _disposable2;

   public Foo()
    {
        _disposable1 = new Bar();
        _disposable2 = new Bar();
    }

   public void Dispose()
   {
     _disposable1.Dispose();
     _disposable2.Dispose();
   }
}
Наследование. Отчистка неуправляемых и управляемых ресурсов.class DerivedClassWithFinalizer : BaseClassWithFinalizer
{
   // To detect redundant calls
   private bool _disposedValue;

    ~DerivedClassWithFinalizer() => this.Dispose(false);

   // Protected implementation of Dispose pattern.
   protected override void Dispose(bool disposing)
    {
       if (!_disposedValue)
        {
           if (disposing)
            {
               // TODO: dispose managed state (managed objects).
           }

           // TODO: free unmanaged resources (unmanaged objects) and override a finalizer below.
           // TODO: set large fields to null.
           _disposedValue = true;
        }

       // Call the base class implementation.
       base.Dispose(disposing);
    }
}