Principales respuestas
Si creo una instancia de clase así: InstanciaDeClase = New Clase ¿Cómo la destruyo?

Pregunta
-
Respuestas
-
Respuesta breve: No la destruyes. Esperas a que el runtime de .NET la destruya por ti.
Respuesta más larga: Estás pensando en otros lenguajes "no gestionados", tales como C++, en los que tú tienes que destruir lo que construyes. Pero .NET es un entorno gestionado ("managed") en el que el sistema se encarga de la creación y destrucción de objetos.
Cuando tú haces InstanciaDeLaClase = New Clase, el sistema hace un seguimiento de esa variable "InstanciaDeLaClase" y de todas las copias que hagas de ella. Cuando todas las copias de la variable se "salen de alcance" (por ejemplo, si era una variable local de un método, cuando sales del método todas las variables declaradas dentro del método se salen de alcance), entonces se dice que la instancia de la clase "se ha vuelto inalcanzable". Una vez que una instancia es inalcanzable, queda a disposición del Garbage Collector para ser destruida.
Si la clase no contiene un destructor (método "Finalize" en VB), entonces la prçoxima vez que se ejecute una pasada del GC éste liberará la memoria ocupada por la clase, resultando efectivamente en su destrucción. Si, por el contrario, contiene un destructor, entonces pasa a la cola de Finalización. Un hilo separado (o varios hilos si es un Server) va ejecutando los finalizadores que hay en la cola, y después de eso quita la referencia de la cola, con lo que la instancia deviene de nuevo inalcanzable y en una segunda pasada del GC será destruida... a no ser que dentro del finalizador se copie la instancia a una variable alcanzable en cuyo caso la clase sufre una resurrección... pero esperemos que tus finalizadores no contengan esta mala práctica.
Cuando la clase contiene recursos no-gestionados, este mecanismo no es capaz de destruirlos, por lo que debes liberarlos ordenadamente antes de que se destruya la instancia de la clase. La convención es realizar esto a través de una interfaz llamada IDisposable, y el llamante de la clase usa la sentencia "Using" para llamar automáticamente a IDisposable.Dispose. Por si acaso olvida hacerlo, se suele añadir un Finalize para liberar los recursos no-gestionados.
- Propuesto como respuesta Óscar NavarroModerator miércoles, 26 de agosto de 2020 14:33
- Marcado como respuesta James2016-2 miércoles, 26 de agosto de 2020 19:05
-
InstanciaDeClase = Nothing
¿Sale de alcance?
- Marcado como respuesta James2016-2 jueves, 27 de agosto de 2020 12:51
Todas las respuestas
-
Respuesta breve: No la destruyes. Esperas a que el runtime de .NET la destruya por ti.
Respuesta más larga: Estás pensando en otros lenguajes "no gestionados", tales como C++, en los que tú tienes que destruir lo que construyes. Pero .NET es un entorno gestionado ("managed") en el que el sistema se encarga de la creación y destrucción de objetos.
Cuando tú haces InstanciaDeLaClase = New Clase, el sistema hace un seguimiento de esa variable "InstanciaDeLaClase" y de todas las copias que hagas de ella. Cuando todas las copias de la variable se "salen de alcance" (por ejemplo, si era una variable local de un método, cuando sales del método todas las variables declaradas dentro del método se salen de alcance), entonces se dice que la instancia de la clase "se ha vuelto inalcanzable". Una vez que una instancia es inalcanzable, queda a disposición del Garbage Collector para ser destruida.
Si la clase no contiene un destructor (método "Finalize" en VB), entonces la prçoxima vez que se ejecute una pasada del GC éste liberará la memoria ocupada por la clase, resultando efectivamente en su destrucción. Si, por el contrario, contiene un destructor, entonces pasa a la cola de Finalización. Un hilo separado (o varios hilos si es un Server) va ejecutando los finalizadores que hay en la cola, y después de eso quita la referencia de la cola, con lo que la instancia deviene de nuevo inalcanzable y en una segunda pasada del GC será destruida... a no ser que dentro del finalizador se copie la instancia a una variable alcanzable en cuyo caso la clase sufre una resurrección... pero esperemos que tus finalizadores no contengan esta mala práctica.
Cuando la clase contiene recursos no-gestionados, este mecanismo no es capaz de destruirlos, por lo que debes liberarlos ordenadamente antes de que se destruya la instancia de la clase. La convención es realizar esto a través de una interfaz llamada IDisposable, y el llamante de la clase usa la sentencia "Using" para llamar automáticamente a IDisposable.Dispose. Por si acaso olvida hacerlo, se suele añadir un Finalize para liberar los recursos no-gestionados.
- Propuesto como respuesta Óscar NavarroModerator miércoles, 26 de agosto de 2020 14:33
- Marcado como respuesta James2016-2 miércoles, 26 de agosto de 2020 19:05
-
Respuesta breve: No la destruyes. Esperas a que el runtime de .NET la destruya por ti.
Respuesta más larga: Estás pensando en otros lenguajes "no gestionados", tales como C++, en los que tú tienes que destruir lo que construyes. Pero .NET es un entorno gestionado ("managed") en el que el sistema se encarga de la creación y destrucción de objetos.
Cuando tú haces InstanciaDeLaClase = New Clase, el sistema hace un seguimiento de esa variable "InstanciaDeLaClase" y de todas las copias que hagas de ella. Cuando todas las copias de la variable se "salen de alcance" (por ejemplo, si era una variable local de un método, cuando sales del método todas las variables declaradas dentro del método se salen de alcance), entonces se dice que la instancia de la clase "se ha vuelto inalcanzable". Una vez que una instancia es inalcanzable, queda a disposición del Garbage Collector para ser destruida.
Si la clase no contiene un destructor (método "Finalize" en VB), entonces la prçoxima vez que se ejecute una pasada del GC éste liberará la memoria ocupada por la clase, resultando efectivamente en su destrucción. Si, por el contrario, contiene un destructor, entonces pasa a la cola de Finalización. Un hilo separado (o varios hilos si es un Server) va ejecutando los finalizadores que hay en la cola, y después de eso quita la referencia de la cola, con lo que la instancia deviene de nuevo inalcanzable y en una segunda pasada del GC será destruida... a no ser que dentro del finalizador se copie la instancia a una variable alcanzable en cuyo caso la clase sufre una resurrección... pero esperemos que tus finalizadores no contengan esta mala práctica.
Cuando la clase contiene recursos no-gestionados, este mecanismo no es capaz de destruirlos, por lo que debes liberarlos ordenadamente antes de que se destruya la instancia de la clase. La convención es realizar esto a través de una interfaz llamada IDisposable, y el llamante de la clase usa la sentencia "Using" para llamar automáticamente a IDisposable.Dispose. Por si acaso olvida hacerlo, se suele añadir un Finalize para liberar los recursos no-gestionados.
Muchas gracias. Siempre se aprende de estas valiosas respuestas.
Y qué efecto tiene hacer:
InstanciaDeClase = Nothing
¿Sale de alcance?
-
InstanciaDeClase = Nothing
¿Sale de alcance?
- Marcado como respuesta James2016-2 jueves, 27 de agosto de 2020 12:51
-
Hola
Veo que ya tienes una respuesta a tu pregunta. Si tienes otra consulta no dudes en abrir otro hilo.
Saludos!
--------------------------------------------------------------------------------
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar MSDNFSF@microsoft.com.
-
Hola
Veo que ya tienes una respuesta a tu pregunta. Si tienes otra consulta no dudes en abrir otro hilo.
Saludos!
--------------------------------------------------------------------------------
Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
Si tiene algún cumplido o reclamo sobre el soporte de MSDN sientase en la libertad de contactar MSDNFSF@microsoft.com.