Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Para la mayoría de los objetos que la aplicación crea, puede utilizar el recolector de elementos no utilizados de .NET Framework para realizar de forma implícita todas las tareas necesarias de administración de memoria. No obstante, cuando se crean objetos que encapsulan recursos no administrados, debe liberar explícitamente los recursos no administrados cuando la aplicación termine de utilizarlos. El tipo más habitual de recurso no administrado es un objeto que contiene un recurso del sistema operativo, como un archivo, ventana o conexión de red. Aunque el recolector de elementos no utilizados puede realizar el seguimiento de un objeto que encapsula un recurso no administrado durante su período de vida, no tiene un conocimiento específico de cómo limpiar el recurso. Para estos tipos de objetos, .NET Framework dispone del método Object.Finalize, que permite que un objeto limpie sus recursos no administrados correctamente cuando el recolector de elementos no utilizados reclama la memoria utilizada por el objeto. De forma predeterminada, el método Finalize no realiza ninguna acción. Si desea que el recolector de elementos no utilizados realice las operaciones de limpieza en el objeto antes de reclamar su memoria, debe reemplazar el método Finalize en su clase. El método Finalize se puede implementar directamente cuando se programa con lenguajes diferentes de C# y las Extensiones administradas de C++. C# y las Extensiones administradas disponen de destructores como mecanismo simplificado para escribir el código de finalización. Los destructores generan automáticamente un método Finalize y llaman al método Finalize de la clase base. Para el código de finalización, debe utilizar la sintaxis del destructor de los lenguajes de programación C# y Extensiones administradas.
El recolector de elementos no utilizados realiza el seguimiento de los objetos que tienen métodos Finalize, utilizando una estructura interna denominada cola de finalización. Cada vez que la aplicación crea un objeto que tiene un método Finalize, el recolector de elementos no utilizados coloca una entrada en la cola de finalización que apunta a ese objeto. La cola de finalización contiene entradas para todos los objetos del montón administrado que necesitan que se llame a su código de finalización antes de que el recolector de elementos no utilizados reclame su memoria.
Implementar destructores o métodos Finalize puede tener un impacto negativo en el rendimiento y por lo tanto debería evitar su uso innecesario. Reclamar la memoria que utilizan los objetos con métodos Finalize requiere al menos dos recolecciones de elementos no utilizados. Cuando el recolector de elementos no utilizados realiza una recolección, reclama la memoria de los objetos inaccesibles sin finalizadores. En este momento, no puede recolectar los objetos inaccesibles que tienen finalizadores. En su lugar, quita las entradas correspondientes a estos objetos de la cola de finalización, y las coloca en una lista de objetos marcados para finalizar. Las entradas de esta lista apuntan a los objetos del montón administrado que están listos para que se llame a su código de finalización. El recolector de elementos no utilizados llama a los métodos Finalize de los objetos de esta lista; a continuación, quita las entradas de la lista. Una recolección de elementos no utilizados posterior determinará que los objetos finalizados se ha recolectado correctamente porque ninguna de las entradas de la lista de objetos marcados para finalizar apunta hacia ellos. En esta recolección de elementos no utilizados posterior, se reclama la memoria del objeto.
Vea también
Método Object.Finalize | Reemplazar el método Finalize | Utilizar la sintaxis de destructor de C# y de Extensiones administradas de C++