vbnet que metodo method how example vb.net dispose idisposable destructor finalize

que - VB.NET: ¿Debería agregarse un método Finalize al implementar IDisposable?



que es dispose() (4)

En Visual Studio, cuando Implements IDisposable la línea " Implements IDisposable ", el IDE agrega automáticamente:

  • una variable de miembro disposedValue
  • a Sub Dispose() Implements IDisposable.Dispose
  • un Sub Dispose(ByVal disposing As Boolean)

El Dispose() debe dejar solo y el código de limpieza se debe colocar en Dispose(disposing) .

Sin embargo, el Patrón de Finalización de Disposición dice que también debe anular Sub Finalize() para llamar a Dispose(False) . ¿Por qué el IDE también agrega esto? ¿Debo agregarlo yo mismo, o de alguna manera se lo llama implícitamente?

EDITAR: ¿ Alguna idea de por qué el IDE agrega automáticamente el 80% de las cosas necesarias pero deja fuera el método Finalize? ¿No es el objetivo de este tipo de características ayudarlo a no olvidar estas cosas?

EDIT2: ¡ Gracias a todos por sus excelentes respuestas, esto ahora tiene perfecto sentido!


Implements IDisposable Public Overloads Sub Dispose() Implements IDisposable.Dispose Dispose(True) GC.SuppressFinalize(Me) End Sub Protected Overloads Sub Dispose(ByVal disposing As Boolean) If disposing Then '' Free other state (managed objects). End If '' Free your own state (unmanaged objects). '' Set large fields to null. End Sub Protected Overrides Sub Finalize() Dispose(False) MyBase.Finalize() End Sub


Como han dicho otros, no es necesario implementar un finalizador a menos que esté manteniendo directamente recursos no administrados. Además, suponiendo que esté trabajando en .NET 2.0 o posterior, es poco probable que necesite implementar un finalizador porque, por lo general, SafeHandle puede utilizarse para ajustar sus recursos no administrados.

Escribí una publicación de blog bastante larga que cubre los antecedentes y la implementación de IDisposable y finalizadores hace un tiempo, que puede valer la pena leer si no está totalmente claro al respecto.


No, no necesita tener Finalize a menos que tenga recursos no administrados para limpiar.

En la mayoría de los casos, la razón por la cual una clase es desechable es porque mantiene referencias a otros objetos administrables IDisposable. En este caso, ningún método de Finalización es necesario o deseable.


Si en realidad tiene recursos no administrados que no serán limpiados automáticamente por el recolector de basura y los limpia en su Dispose (), entonces sí, debe hacer lo mismo en Finalize ().

Si está implementando IDisposable por algún otro motivo, no es necesario implementar Finalize ().

La pregunta básica es: si no se llamó a Dispose () y se recolectó la basura de su objeto, ¿la memoria se fugaría? En caso afirmativo, implemente Finalize. Si no, no es necesario. Además, evite implementar Finalize "solo porque sea más seguro". Los objetos con finalizadores personalizados pueden necesitar dos pases de GC para liberarlos, una para ponerlos en la cola de finalizadores pendientes y una segunda pasada para liberar realmente su memoria.