En los lenguajes de programación, un objeto solo puede tener una variable durante su existencia, después de la instanciación no se puede modificar. Por lo tanto, la misma celda de memoria no se puede asignar a nuevos valores, por lo que se requiere algún tipo de administración de memoria automatizada para administrar los espacios no utilizados. Estos espacios no utilizados se denominan basura y todo el proceso de gestión eficiente de la memoria se denomina recolección de basura.
El objetivo principal de un recolector de basura es separar los objetos muertos de los objetos vivos y recuperar el espacio para su reutilización. Básicamente, todo funciona en el montón administrado, que no es más que un bloque de memoria, y el recolector de basura revisa periódicamente la memoria del montón para asignar memoria a nuevos objetos. Existen dos métodos para liberar recursos no administrados como archivos y conexiones de base de datos: disponer y finalizar.
Este artículo te ayuda a entender la diferencia entre los dos.
Dispose es una forma estándar para que los usuarios le digan a los objetos que liberen sus recursos y que no intenten acceder a los objetos de nuevo. El método de disposición proporciona el control de la limpieza explícita de la memoria al hacer que los objetos sean inutilizables..
Cuando los usuarios llaman al método Dispose (), se supone que el objeto libera todos sus recursos costosos, por lo que está disponible para su reutilización. Nunca es llamado por el recolector de basura, que solo viene a jugar cuando la memoria administrada se vuelve escasa. Se utiliza una interfaz especial llamada "IDisposable" para decidir dónde y cómo implementar Dispose (). Pero, ¿qué sucede cuando no se llama al método de disposición??
Si el método de desechar no es llamado, el plan alternativo es usar el método Finalize () para la limpieza. El recolector de basura lo llama para realizar una limpieza final de recursos antes de liberar memoria. El concepto de limpieza oportuna se vuelve inaplicable aquí porque en lugar de desasignar la memoria inmediatamente, el objeto se agrega a la cola de finalización para luego ser destruido. Finalizar es más como una salvaguardia implementada en el caso de un error de programación y la eliminación no limpia los recursos, en cuyo caso el recolector de basura invoca el método Finalize () para eliminar objetos inalcanzables en la secuencia que desee..
Se llama al método Dispose para acelerar la liberación de recursos no administrados, como los manejadores de bases de datos, los manejadores de archivos, los semáforos y otros objetos asignados por el sistema operativo. El método de disposición se invoca para ejecutar el código necesario para limpiar la memoria no utilizada y los recursos escasos como los identificadores GDI. En términos simples, el método de desechar proporciona el control de la limpieza explícita de la memoria. El método de finalización, por otro lado, es parte de la recolección de basura que se utiliza para realizar la operación de limpieza final en un objeto antes de que se recoja la basura. En pocas palabras, se llama al método de finalización para liberar los recursos no administrados en poder de un objeto antes de que se destruya.
El código de usuario y la clase que implementa el método para disponer de recursos pueden invocar explícitamente el método Dispose. Sin embargo, la memoria no se puede liberar hasta que el recolector de basura realice el proceso de limpieza. Se puede llamar al método incluso si todavía existen otras referencias al objeto. El método de finalización, por el contrario, puede ser invocado por el recolector de basura solo después de que determine que la última instancia del objeto de memoria se destruye y no existen más referencias al objeto. Después de que se ejecuta el método de finalización, el objeto se elimina de la memoria del montón.
El proceso de eliminación de un objeto de la memoria se denomina patrón de disposición, que se puede utilizar para los objetos que acceden a recursos no administrados porque el recolector de basura no puede reclamar recursos no administrados. La interfaz "IDisponible" junto con un método adicional de Dispose (booleano) se implementa para solicitar la liberación de recursos no administrados. Un método de finalización se ejecuta cuando la instancia de un objeto se destruye antes de su desasignación. Es un método no determinista que se produce a discreción del recolector de basura y puede que ni siquiera ocurra. No debe implementarse en objetos gestionados hasta que sea extremadamente necesario..
Es mucho más rápido usar un método de desechar en lugar de finalizar para la eliminación instantánea de objetos. Los destructores se convierten automáticamente para finalizar el método en tiempo de ejecución. Es invocado automáticamente por el recolector de basura cuando el objeto sale del ámbito, lo que generalmente ocurre cuando se destruye la instancia de ese objeto. El problema con el método de finalización es que su significado no es determinista, ya que no es seguro cuándo recuperar la memoria a la que ya no se hace referencia a través de la recolección de elementos no utilizados. Sin embargo, puede que no libere la memoria inmediatamente; de hecho, puede que nunca sea llamado y no puede ser forzado explícitamente.
La principal diferencia entre los métodos de disponer y finalizar es que el primero es un método determinista que elimina los objetos instantáneamente cuando ya no están en uso, mientras que el último es un método no determinista para asignar recursos no administrados, lo que significa que es un método de respaldo para liberar instancias de objetos de memoria cuando se salen del alcance antes de su desasignación. Siempre es recomendable utilizar el método de desechar para finalizar a menos que sea extremadamente necesario.
En otros términos, finalizar es una salvaguardia implementada para limpiar los recursos no administrados cuando no se puede llamar al método de eliminación en caso de algún error de programación. El recolector de basura invoca el método de finalización cuando un objeto está a punto de ser expulsado de la memoria de almacenamiento dinámico.