Dispose()
nie zostanie wywołany automatycznie. Jeśli istnieje finalizator , zostanie on wywołany automatycznie. Implementacja IDisposable
zapewnia użytkownikom klasy możliwość szybkiego zwolnienia zasobów, zamiast czekać na odśmiecacz.
Preferowanym sposobem dla klienta jest użycie instrukcji using
, która obsługuje automatyczne wywoływanie Dispose()
, nawet jeśli istnieją wyjątki.
Prawidłowa realizacja IDisposable
jest:
class MyClass : IDisposable
{
private bool disposed = false;
void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!disposed)
{
if(disposing)
{
// Manual release of managed resources.
}
// Release unmanaged resources.
disposed = true;
}
}
~MyClass() { Dispose(false); }
}
Jeżeli użytkownik klasy nazywa Dispose()
porządkowe odbywa się bezpośrednio. Jeśli obiekt zostanie przechwycony przez garbage collector, wywołuje Dispose(false)
, aby wykonać czyszczenie. Zwróć uwagę, że po wywołaniu z finalizatora (metoda ~MyClass
) odniesienia zarządzane mogą być nieprawidłowe, więc tylko niezarządzane zasoby mogą zostać zwolnione.