Share via


Cómo: Implementar el modelo DisposeFinalize (Visual Basic)

Actualización: noviembre 2007

El modelo DisposeFinalize garantiza que se liberan los recursos cuando ya no se necesita el objeto.

Ejemplo

La clase ResourceClass del ejemplo siguiente utiliza recursos administrados y no administrados y, a continuación, utiliza el modelo DisposeFinalize para desecharlos correctamente. Los recursos y sus funciones son:

  • La implementación del método Dispose, que permite a los usuarios de la clase desechar las instancias de clase. Este método llama a Dispose(True) para desechar los recursos del objeto y, a continuación, llama a SuppressFinalize para evitar que el código de finalización se ejecute una segunda vez.

  • El reemplazo del método base Finalize, que permite al recolector de elementos no utilizados de Common Language Runtime (CLR) desechar las instancias de clase. Este método llama a Dispose(False) para desechar los recursos del objeto. Observe que si se llama a Dispose previamente para el objeto, su llamada a SuppressFinalize evitaría que el recolector de elementos no utilizados llamase al método Finalize.

  • La sobrecarga del método Dispose, que lleva a cabo el trabajo de eliminación. Toma un parámetro de tipo Boolean, disposing, que indica si el código ha iniciado la eliminación del objeto. Cuando desecha un objeto, también se deben desechar todos sus recursos. Cuando el recolector de elementos no utilizados de CLR elimina un objeto, sólo deben eliminarse los recursos no administrados; el recolector elimina automáticamente los recursos administrados cuando resulta necesario.

Para obtener más información, vea Duración de los objetos: cómo se crean y destruyen.

    Public Class ResourceClass
        Implements IDisposable

        Private managedResource As System.ComponentModel.Component
        Private unmanagedResource As IntPtr
        Protected disposed As Boolean = False

        Public Sub New()
            ' Insert appropriate constructor code here.
        End Sub

        Protected Overridable Overloads Sub Dispose( _
            ByVal disposing As Boolean)
            If Not Me.disposed Then
                If disposing Then
                    managedResource.Dispose()
                End If
                ' Add code here to release the unmanaged resource.
                unmanagedResource = IntPtr.Zero
                ' Note that this is not thread safe.
            End If
            Me.disposed = True
        End Sub

        Public Sub AnyOtherMethods()
            If Me.disposed Then
                Throw New ObjectDisposedException(Me.GetType().ToString, _
                    "This object has been disposed.")
            End If
        End Sub

#Region " IDisposable Support "
        ' Do not change or add Overridable to these methods.
        ' Put cleanup code in Dispose(ByVal disposing As Boolean).
        Public Overloads Sub Dispose() Implements IDisposable.Dispose
            Dispose(True)
            GC.SuppressFinalize(Me)
        End Sub
        Protected Overrides Sub Finalize()
            Dispose(False)
            MyBase.Finalize()
        End Sub
#End Region
    End Class

Este ejemplo de código también está disponible como fragmento de código de IntelliSense. En el selector de fragmentos de código, se encuentra en Lenguaje Visual Basic. Para obtener más información, vea Cómo: Insertar fragmentos de código en el código (Visual Basic).

Compilar el código

Para este ejemplo se necesita:

Estos cambios se deben realizar en el código:

  • Reemplace ResourceClass con el nombre de la clase que implementa IDisposable.

  • Utilice la comprobación de AnyOtherMethods en cualquier método que utilice recursos que se pueden haber desechado.

  • Reemplace la declaración managedResource con declaraciones de cualquier objeto administrado en su clase que deba ser desechado. Si una clase implementa IDisposable o tiene un método Close, probablemente necesita ser desechado. En el método Dispose, cierre o deseche estos objetos.

  • Reemplace la declaración unManagedResource con declaraciones de objetos no administrados en su clase que deban ser desechados. El método para desechar estos objetos depende de cómo se define el objeto. Para obtener detalles, consulte la documentación sobre el objeto.

Programación eficaz

Cuando se ha llamado al método Dispose, los objetos contenidos en su colección no serán válidos. Debería probar el campo disposed antes de realizar cualquier operación en su objeto. Para obtener un ejemplo, vea el método AnyOtherMethods en el ejemplo de código.

Vea también

Conceptos

Implementar un método Dispose

Referencia

IDisposable

Otros recursos

Recolección de elementos no utilizados