miércoles, 13 de enero de 2010

Cuando y como implementar IDisposable

Cuando implementar la interfaz IDisposable:

  1. Cuando la clase contenga alguna variable de tipo "Unmanaged".
  2. Cuando la clase contenga alguna variable que implemente la interfaz IDisposable.
  3. Cuando la clase contenga manejadores (handlers) de eventos.
En los dos primeros casos el motivo es obvio, pero en el tercero es un poco más obscuro. Cuando tengamos una clase que contenga manejadores de eventos hay que implementar la interfaz IDisposable para quitar el manejador cuando se llame al método Dispose. Si no se hace las referencias entre las dos clases se mantienen en memoria y no se eliminan.

Como implementar la interfaz IDisposable:

Para una correcta implementación de la interfaz se deberá usar el siguiente código obviando el generado automáticamente por VS puesto que este no permite efectuar correctamente un Override del método Dispose en las clases herederas al no poder consultar el estado de disposedValue.


#Region "IDisposable"
    Private m_disposed As Boolean 

    Protected ReadOnly Property Disposed() as Boolean
        Get
            Return m_disposed
        End Get
    End Property

    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not m_disposed Then
            If disposing Then
                ' Free other state (managed objects).
            End If
            ' Free your own state (unmanaged objects).
            ' Set large fields to null.
        End If

        m_disposed = True
    End Sub

    Public Sub Dispose() Implements IDisposable.Dispose
        ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub

    Protected Overrides Sub Finalize()
        ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
        Dispose(False)
        MyBase.Finalize()
    End Sub
#End Region