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:
- Obtener acceso a los miembros de los espacios de nombres System y System.ComponentModel. Agregar una instrucción Imports si no se incluyen nombres de miembro completos en el código. Para obtener más información, vea Instrucción Imports (Tipo y espacio de nombres de .NET).
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.