2009-10-16 21 views
5

Aquí está el código de MSDN. No entiendo por qué el trabajo no se realiza solo en el método Dispose() habitual aquí. ¿Cuál es el propósito de tener el método Dispose (bool)? ¿Quién llamaría a Dispose (false) aquí?Propósito del patrón Dispose calling Dispose (IsDisposing) en 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; 
    } 
} 

Respuesta

14

El finalizador llamaría Dispose(false) - en cuyo caso no se toca cualquiera de los otros recursos gestionados (que ya hayan sido finalizados).

Personalmente, no sigo este patrón a menudo, porque solo muy rara vez necesito un finalizador, y también es raro para mí escribir una implementación IDisposable no sellada. Si está escribiendo una clase sellada sin un finalizador, me gustaría una implementación simple.

+1

Aún debe seguir este patrón si está encapsulando un recurso en un IDisposable no sellada clase, por lo tanto, las subclases se pueden manejar de manera adecuada (y consistente). –

+0

Incluso si no se necesita un finalizador. –

+0

@Reed: la única razón para hacer esto cuando las subclases están involucradas es para que * they * puedan tener finalizadores; de lo contrario, ¿por qué molestarse con un parámetro que siempre será cierto? –

0

Su método de eliminación (eliminación) no debe liberar recursos explícitamente si se llama desde el finalizador, ya que GC puede liberar estos recursos.

Por lo tanto, Dispose (disposing) debe verificar si se llamó manualmente o desde GC y actúa de manera adecuada.

0

En cuanto a la respuesta,

Su método Dispose (desechar) no debería afectar de manera explícita recursos gratuitos si se llama desde finalizador, ya que estos recursos pueden ser liberados ya por GC.

Falta una palabra importante. Esto realmente debería decir: Método

Su Desechar (desechar) no debe liberar explícitamente finalizables (es decir gestionados) recursos si se llama desde finalizador, ya que estos recursos pueden ser liberados ya por GC. Solo los recursos nativos se deben liberar en un Finalizer.

Estoy bastante seguro de que el cartel quiere decir esto, pero simplemente no era lo suficientemente explícito en el mensaje:)

Cuestiones relacionadas