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

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.

    miércoles, 26 de agosto de 2020 8:07
  • InstanciaDeClase = Nothing

    ¿Sale de alcance? 

    Más o menos. La variable en sí misma no sale de alcance; por ejemplo, más abajo podrías volver a hacer un New y asignarle una nueva instancia a la misma variable. Pero la instancia que estaba previamente almacenada en la variable antes de asignarle el Nothing sí que se vuelve inalcanzable en el momento en que a la variable le asignas cualquier otra cosa (incluyendo un Nothing) y por lo tanto la instancia queda a disposición del GC en ese momento.
    • Marcado como respuesta James2016-2 jueves, 27 de agosto de 2020 12:51
    jueves, 27 de agosto de 2020 5:41

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.

    miércoles, 26 de agosto de 2020 8:07
  • 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? 

    miércoles, 26 de agosto de 2020 19:05
  • InstanciaDeClase = Nothing

    ¿Sale de alcance? 

    Más o menos. La variable en sí misma no sale de alcance; por ejemplo, más abajo podrías volver a hacer un New y asignarle una nueva instancia a la misma variable. Pero la instancia que estaba previamente almacenada en la variable antes de asignarle el Nothing sí que se vuelve inalcanzable en el momento en que a la variable le asignas cualquier otra cosa (incluyendo un Nothing) y por lo tanto la instancia queda a disposición del GC en ese momento.
    • Marcado como respuesta James2016-2 jueves, 27 de agosto de 2020 12:51
    jueves, 27 de agosto de 2020 5:41
  • 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. 

    jueves, 27 de agosto de 2020 14:58
    Moderador
  • 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. 

    OK, gracias.
    jueves, 27 de agosto de 2020 16:24