Compartir a través de


Inicialización y finalización de componentes

Actualización: noviembre 2007

Un componente se inicializa por medio de su constructor (SubNew en Visual Basic) y se destruye por medio de su destructor (SubFinalize en Visual Basic). Se llama al constructor del componente cuando se crea una instancia de éste; después, no es posible llamar al constructor. La llamada al destructor se realiza inmediatamente antes de destruirlo mediante la recolección de elementos no utilizados y la reclamación de la memoria que ocupa.

Nota para Visual Basic:

En versiones anteriores de Visual Basic, los eventos Initialize y Terminate servían para el mismo propósito que el constructor y el destructor.

Esperar la recolección de elementos no utilizados

Una vez que la recolección de elementos no utilizados determina que el componente ya no está al alcance de ningún código en ejecución, Common Language Runtime llama al destructor del componente. Esto sucede si se liberaron todas las referencias al componente o si las únicas referencias al componente las mantienen objetos aislados de forma similar de todo el código en ejecución, por ejemplo, en el caso de referencias circulares.

Puesto que puede producirse un retardo entre el momento en que un usuario termina con el componente y el momento en que se llama a su destructor, en el ciclo de vida de los componentes de .NET Framework se introdujo un paso adicional: si el componente adquiere recursos del sistema, como conexiones de base de datos o controladores de objetos del sistema Windows, se debe implementar la interfaz IDisposable y proporcionar un método Dispose, de modo que los usuarios del componente puedan elegir cuándo se liberan esos recursos.

Ciclo de vida de un componente

Inicialización de tipo: cuando se crea la primera instancia del componente, el primer código que se ejecuta es el código de inicialización compartido. Las referencias a cualquier miembro compartido también harán que se ejecute el constructor compartido. Esto incluye todos los campos compartidos (variables miembro) inicializados y el constructor compartido (SharedSubNew), si existe. En el código siguiente se crea una fuente de referencia para toda la clase.

Nota:

La palabra clave de C# que corresponde a Shared es static, que no debe confundirse con la palabra clave Static de Visual Basic.

¿Cuándo debe implementarse un método Dispose?

Si el componente hereda de Component, se proporciona una implementación predeterminada de Dispose. Esta implementación puede reemplazarse para proporcionar código de limpieza personalizado. Si genera un componente mediante la creación de una implementación personalizada de IComponent, es recomendable que implemente IDisposable para proporcionar al componente un método Dispose.

El componente necesitará un método Dispose si asigna objetos del sistema, conexiones de base de datos u otros recursos escasos que deban liberarse tan pronto como el usuario termine con el componente.

También debe implementarse un método Dispose si el componente contiene referencias a otros objetos que tengan métodos Dispose.

¿Por qué implementar Dispose?

Según cuál sea la actividad del sistema, puede transcurrir un intervalo de tiempo impredecible entre el momento en que el usuario termina de utilizar el componente y el momento en que la recolección de elementos no utilizados detecta que el código del componente está fuera de alcance. Si no proporciona un método Dispose, el componente continuará reteniendo sus recursos durante este intervalo.

Un escenario pesimista

Imagine un componente de servidor que utilice una conexión de base de datos y no tenga un método Dispose. En un servidor con una gran cantidad de memoria, podría crear y liberar muchas instancias del componente sin producir un gran impacto sobre la memoria libre. En este caso, la recolección de elementos no utilizados podría no destruir los componentes durante algún tiempo después de que se liberen las referencias a estos componentes.

Finalmente, todas las conexiones de base de datos disponibles podrían estar ocupadas por componentes liberados pero no destruidos. Aunque el servidor no experimentara escasez de memoria, podría ser incapaz de responder a las peticiones del usuario.

Vea también

Tareas

Cómo: Crear y configurar componentes en modo de diseño

Conceptos

Características de clases de componentes

Cambios en la creación de instancias de componentes en Visual Basic

Referencia

Dispose

Finalize