2009-10-16 9 views
5

Questo è il codice MSDN. Non capisco perché il lavoro non sia fatto solo nel regolare metodo Dispose() qui. Qual è lo scopo di avere il metodo Dispose (bool)? Chi chiamerebbe mai Dispose (falso) qui?Scopo di Dispose calling Dispose (IsDisposing) pattern in 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; 
    } 
} 

risposta

14

Il finalizzatore chiamerebbe Dispose(false) - nel qual caso non si tocca una qualsiasi delle altre risorse gestite (che possono già sono stati finalizzati).

Personalmente non seguo questo schema spesso - perché ho solo molto, molto raramente bisogno di un finalizzatore, ed è anche raro che io scriva un'implementazione non sigillata IDisposable. Se stai scrivendo una lezione sigillata senza finalizzatore, farei una semplice implementazione.

+1

Si dovrebbe comunque seguire questo modello, se stai incapsulare una risorsa IDisposable in un non-sigillato classe, però, così le sottoclassi possono essere gestite correttamente (e coerentemente). –

+0

Anche se non è necessario alcun finalizzatore. –

+0

@Reed: l'unica ragione per farlo quando sono coinvolte sottoclassi è che * esse * possono avere finalizzatori - altrimenti perché preoccuparsi di un parametro che sarà sempre vero? –

0

Il metodo Dispose (disposizione) non deve liberare esplicitamente le risorse se è chiamato dal finalizzatore, poiché queste risorse possono essere già state liberate da GC.

Quindi, Dispose (smaltimento) dovrebbe verificare se è stato chiamato manualmente o da GC e agisce in modo appropriato.

0

Per quanto riguarda la risposta,

tuo metodo Dispose (smaltimento) dovrebbe non esplicitamente risorse gratuite se viene chiamato da finalizzatore, dal momento che queste risorse possono essere già liberati da GC.

Manca una parola importante. Questo dovrebbe davvero dire: metodo

tuo Dispose (smaltimento) non dovrebbe esplicitamente libero finalizable (cioè gestito) risorse se viene chiamato da finalizzatore, dal momento che queste risorse possono essere già liberati da GC. Solo le risorse native dovrebbero essere rilasciate in un Finalizer.

Sono abbastanza sicuro che il manifesto ha significato questo, ma non era abbastanza esplicita nel post:)

Problemi correlati