2009-10-16 12 views
5

Oto kod z MSDN. Nie rozumiem, dlaczego praca nie jest po prostu zrobiona w zwykłej metodzie Dispose() tutaj. Jaki jest cel posiadania metody Dispose (bool)? Kto mógłby kiedykolwiek nazwać Dispose (false) tutaj?Cel usuwania wywołań Usuwanie (IsDisposing) wzorca w języku C#?

public void Dispose() 
{ 
    Dispose(true); 

    // Use SupressFinalize in case a subclass 
    // of this type implements a finalizer. 
    GC.SuppressFinalize(this);  
} 

protected virtual void Dispose(bool disposing) 
{ 
    // If you need thread safety, use a lock around these 
    // operations, as well as in your methods that use the resource. 
    if (!_disposed) 
    { 
     if (disposing) { 
      if (_resource != null) 
       _resource.Dispose(); 
       Console.WriteLine("Object disposed."); 
     } 

     // Indicate that the instance has been disposed. 
     _resource = null; 
     _disposed = true; 
    } 
} 

Odpowiedz

14

Finalizer nazwałbym Dispose(false) - w takim przypadku nie dotykać innych zarządzanych zasobów (które zostały już sfinalizowane).

Osobiście nie podążam za tym wzorcem często - ponieważ bardzo, bardzo rzadko potrzebuję finalizatora, a także rzadko zdarza mi się napisać niezamkniętą implementację IDisposable. Jeśli piszesz zamkniętą klasę bez finalizatora, wybrałbym prostą implementację.

+1

Należy nadal podążać ten wzór jeśli enkapsulacji zasobu IDisposable w nie-uszczelnione klasa, więc podklasy mogą być obsługiwane poprawnie (i konsekwentnie). –

+0

Nawet jeśli nie jest potrzebny żaden finalizator. –

+0

@Reed: Jedynym powodem, aby to zrobić, gdy są zaangażowane podklasy jest to, że * oni * mogą mieć finalizatory - w przeciwnym razie po co zawracać sobie głowę parametrem, który zawsze będzie prawdziwy? –

0

Twoja metoda usuwania (unieszkodliwiania) nie powinna jawnie zwiększać zasobów, jeśli jest wywoływana z finalizatora, ponieważ zasoby te mogą być już uwolnione przez GC.

Tak więc utylizacja (utylizacja) powinna sprawdzić, czy została wywołana ręcznie lub z GC i działa poprawnie.

0

Jeśli chodzi o odpowiedź,

(utylizacji) metoda Twój Usuwać należy wyraźnie nie wolne środki, jeśli jest wywoływana z finalizatora, ponieważ te zasoby mogą być już uwolniony przez GC.

Brakuje ważnego słowa. Powinno to naprawdę powiedzieć: (utylizacji) Metoda

Twój wyrzucić nie powinny wyraźnie wolny finalizable (to udało) Zasoby jeśli jest wywoływana z finalizatora, ponieważ te zasoby mogą być już uwolniony przez GC. W Finalizerze powinny być wydawane wyłącznie zasoby natywne.

jestem całkiem pewny, że plakat oznaczało to, ale po prostu nie było wystarczająco wyraźne w poście:)

Powiązane problemy