La gestión de memoria es un aspecto clave al trabajar con objetos en Visual Basic, especialmente si la aplicación utiliza recursos que requieren liberación manual: archivos, conexiones a bases de datos u objetos externos.
En el clásico VB (VB6), los recursos se liberaban manualmente llamando a Set obj = Nothing. En .NET (VB.NET) se ha implementado un recolector de basura automático que limpia los objetos no utilizados. Sin embargo, no toda liberación de memoria se realiza automáticamente, especialmente para recursos unmanaged.
El recolector de basura automático libera memoria de objetos .NET, pero no sabe cómo recoger recursos externos o manuales a tiempo (descriptores de archivos, conexiones, flujos). Ignorar estos detalles lleva a fugas de memoria y bloqueo de recursos.
Para liberar correctamente los recursos externos, se utiliza la interfaz IDisposable y la expresión Using...End Using, lo que garantiza una liberación determinista.
Ejemplo de código:
' Liberación garantizada del descriptor de archivo Using reader As New StreamReader("data.txt") Dim content As String = reader.ReadToEnd() ' ... procesamiento de datos ... End Using ' Para objetos que no soportan IDisposable, liberación manual: Dim obj As SomeComObject = New SomeComObject() ' ... uso ... System.Runtime.InteropServices.Marshal.ReleaseComObject(obj) obj = Nothing
Características clave:
¿Si no se utiliza Using para FileStream, el recurso aún se liberará gracias a GC?
No, la liberación ocurrirá en un momento indeterminado. Puede surgir un bloqueo de archivo y una fuga de recursos.
¿Es la llamada a Set obj = Nothing equivalente a llamar a Dispose()?
No, Set obj = Nothing solo elimina la referencia, pero no garantiza la liberación inmediata de los recursos. Dispose() o Using son el único camino correcto para una liberación determinista.
¿Es necesario llamar a Dispose para objetos que heredan de DataSet/DataTable?
Sí, aunque son liberados por el GC, muchos recursos asociados (como conexiones a bases de datos) requieren una llamada manual a Dispose o Using, especialmente para DataAdapter, Connection, Command.
Lectura de datos de un gran archivo sin Using, sin Dispose. Después de un tiempo, la aplicación no puede abrir un nuevo archivo: "File is in use by another process".
Ventajas:
Desventajas:
Apertura de conexión con una base de datos o archivo a través de Using. Obtención, procesamiento de datos, liberación automática del recurso.
Ventajas:
Desventajas: