2011-08-06 11 views

Respuesta

44

Dispose() no se llamará automáticamente. Si hay un finalizador se llamará automáticamente. La implementación de IDisposable proporciona una forma para que los usuarios de su clase liberen los recursos temprano, en lugar de esperar al recolector de elementos no utilizados.

La forma preferible para un cliente es utilizar la instrucción using que maneja llamadas automáticas de Dispose() incluso si hay excepciones.

Una aplicación adecuada de IDisposable es:

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); } 
} 

Si el usuario de la clase llama Dispose() la limpieza se lleva a cabo directamente. Si el objeto es atrapado por el recolector de basura, llama al Dispose(false) para hacer la limpieza. Tenga en cuenta que cuando se llama desde el finalizador (el método ~MyClass) las referencias administradas pueden no ser válidas, por lo que solo se pueden liberar recursos no administrados.

3

Usted se tener que llamar a este método de forma manual, tal vez en una construcción como

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

// now 'myclass'is Disposed 
5

Si usted instancia su objeto en un comunicado using, Dispose() se llama para que cuando el código sale del bloque using

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

Si no se utiliza using, entonces le toca a usted (el código de llamada) para deshacerse de su objeto llamando explícitamente a Dispose().

Además, usted (el implementador de MyObject) puede agregar soporte para un finalizador en caso de que su interlocutor no llame a Dispose(). Más información here.

6

Para asegurarse de que los recursos están correctamente eliminados, debe implementar IDisposable y llamar al Dispose en el destructor (finalizador).

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; 
     } 
    } 
} 
Cuestiones relacionadas