2011-08-06 11 views

Odpowiedz

44

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.

3

You będzie trzeba ręcznie wywołać tę metodę, może w konstrukcie jak

using(var myclass = new MyClass()) 
{ 
    // do something with myclass 
} 

// now 'myclass'is Disposed 
5

Jeśli instancji swój obiekt w using oświadczeniu Dispose() jest wywoływana dla ciebie, gdy kod zamyka blok using

using(var myObject = new MyDisposableObject()) 
{ 
    blah(); 
} // Dispose() is called here (or whenever the code exits the block) 

Jeśli nie używać using, to zależy od ciebie (kod wywołujący) do dysponowania swoim obiekcie jawnie przez wywołanie Dispose().

Również ty (osoba wdrażająca MyObject) może dodać obsługę finalizatora na wypadek, gdyby Twój rozmówca nie zadzwonił do Dispose(). Więcej informacji: here.

6

Aby upewnić się, że zasoby są prawidłowo rozmieszczone, musisz wdrożyć IDisposable i wywołać Dispose w destruktorze (finalizatorze).

class Foo : IDisposable 
{ 
    private bool m_disposed = false; 

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

    ~Foo() 
    { 
     Dispose(false); 
    } 

    protected void Dispose(bool disposing) 
    { 
     if (!m_disposed) 
     { 
      if (disposing) 
      { 
       //release managed resources 
      } 
      //release unmanaged resources 

      m_disposed = true; 
     } 
    } 
} 
Powiązane problemy