none
Eliminacion de formularios RRS feed

  • Pregunta

  • Buenos dias! La duda por la que escribo, es debido a la gestion de los formularios en una aplicacion que estoy desarrollando. Tengo muchos formularios para las distintas partes de mi programa, y a su vez, tengo controles dinamicos que generan botones para abrir nuevos formularios, por toda esta carga, me quiero asegurar de que verdaderamente se liberaron los recursos al cerrar el formulario, debido a que tengo formularios que si los borro con un Close() realmente no se borran (los llamo desde el formulario principal, los uso y despues los cierro con el metodo anteriormente mencionado), porque siguen con el texto cambiado o los contadores no se reiniciaron, ademas de que no me genera un NullReferenceException. Lo ideal seria crear un nuevo objeto en el metodo que lo llamo, y despues eliminarlo con Dispose() ? Dejo un ejemplo de esto ultimo:

    private void Button1_Click (object sender, EventArgs e)
    {
    //Crear objeto
    Formulario FormularioNuevo = new Formulario();
    
    //Llamarlo y una vez abierto, cerrarlo desde el mismo con el evento Close();
    FormularioNuevo.ShowDialog();
    
    //Eliminarlo (No se si lo elimina totalmente y si se elminino con Close(), me generaria una excepion)
    FormularioNuevo.Dispose();
    }


    tomasgavagnin





    • Editado Orion1998 sábado, 17 de agosto de 2019 13:25
    sábado, 17 de agosto de 2019 13:09

Todas las respuestas

  • Efectivamente, es correcto llamar al Dispose() cuando ya no necesites usar el formulario.

    Pero con eso no es suficiente para que se liberen los recursos utilizados por el formulario. Además es necesario que se vuelva inalcanzable, cosa que se consigue destruyendo todas las referencias del formulario. En tu caso, eso sí que se cumple porque la única referencia es la variable FormularioNuevo, que es local al método y por lo tanto desaparece al salir del método. Pero ojo en caso de que desde dentro del formulario, por ejemplo, llames a una clase y le pases el "this". Eso haría que no sea inalcanzable porque todavía podría ser referenciado desde la clase que recibió el this, y por lo tanto sus recursos no se destruirían a pesar de haber llamado a Dispose().

    Incluso aunque el formulario sea ya inalcanzable por haber eliminado todas las referencias, aún así todavía no se libera la memoria ocupada. Esto solo hace que se ponga a disposición del recogemigas ("Garbage Collector"). Cuando exista presión de memoria en el proceso, entonces se dispara un barrido del GC, y es entonces cuando ya por fin se libera la memoria que ocupaba el formulario.

    sábado, 17 de agosto de 2019 14:21