none
¿Los objetos que se declaran a nivel de función o precedimiento se liberan al concluir este?

    Pregunta

  • Es decir si declaro un objeto dentro de una función, por ejemplo:

    Dim ProcesoActual As Process = Process.GetCurrentProcess

    ¿Al concluir la función ProcesoActual se libera automáticamente y por tanto ya no es necesario ejecutar ProcesoActual.Dispose?

    sábado, 5 de noviembre de 2016 19:04

Respuestas

  • "James-2016" preguntó:

    > Es decir si declaro un objeto dentro de una función, por ejemplo:
    >
    >     Dim ProcesoActual As Process = Process.GetCurrentProcess
    >
    > ¿Al concluir la función ProcesoActual se libera automáticamente y por
    > tanto ya no es necesario ejecutar ProcesoActual.Dispose?

    Al finalizar el procedimiento Function, Sub, Property, New donde hayas declarado el objeto Processs, no se liberarán automáticamente los recursos que aquel haya podido utilizar, ya que para ello tienes que llamar explícitamente a su método Dispose, o en el caso del objeto Process, también puedes llamar a su método Close.

    Lo que ocurre es que aquellos objetos que implementan la interfaz IDisposable, normalmente suelen reemplazar el método Finalize declarado en la clase base System.Object, que será el encargado de llamar al método Dispose de la clase cuando la aplicación se cierre, para que se liberen adecuadamente los recursos no administrados utilizados por el objeto, porque si éste no utiliza recursos no administrados (archivos, bases de datos, imágenes, etc.), tampoco es sumamente necesario reemplazar el método Finalize.

    En el caso del objeto System.Diagnostic.Process, hereda el método Dispose de su clase base (System.ComponentModel.Component), y sobrecarga el método Dispose con un parámetro Boolean para que en el caso de que éste tenga el valor True se llame al método Close del objeto Process, que realmente es el encargado de liberar los recursos que haya podido utilizar el objeto Process.

    Si esta pregunta tiene relación con la respuesta que te ofrecí el jueves pasado en relación a la conversación En propiedades del proyecto hay una opción Convertir aplicación de instancia única ¿dónde se puede ver el código que hace esa conversión?, observa que se llama al método Dispose del objeto Process tanto en el método PrevInstance.Process como en el método PrevInstance.Activate, y antes de que estos métodos finalicen.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    domingo, 6 de noviembre de 2016 7:48
    Moderador

Todas las respuestas

  • "James-2016" preguntó:

    > Es decir si declaro un objeto dentro de una función, por ejemplo:
    >
    >     Dim ProcesoActual As Process = Process.GetCurrentProcess
    >
    > ¿Al concluir la función ProcesoActual se libera automáticamente y por
    > tanto ya no es necesario ejecutar ProcesoActual.Dispose?

    Al finalizar el procedimiento Function, Sub, Property, New donde hayas declarado el objeto Processs, no se liberarán automáticamente los recursos que aquel haya podido utilizar, ya que para ello tienes que llamar explícitamente a su método Dispose, o en el caso del objeto Process, también puedes llamar a su método Close.

    Lo que ocurre es que aquellos objetos que implementan la interfaz IDisposable, normalmente suelen reemplazar el método Finalize declarado en la clase base System.Object, que será el encargado de llamar al método Dispose de la clase cuando la aplicación se cierre, para que se liberen adecuadamente los recursos no administrados utilizados por el objeto, porque si éste no utiliza recursos no administrados (archivos, bases de datos, imágenes, etc.), tampoco es sumamente necesario reemplazar el método Finalize.

    En el caso del objeto System.Diagnostic.Process, hereda el método Dispose de su clase base (System.ComponentModel.Component), y sobrecarga el método Dispose con un parámetro Boolean para que en el caso de que éste tenga el valor True se llame al método Close del objeto Process, que realmente es el encargado de liberar los recursos que haya podido utilizar el objeto Process.

    Si esta pregunta tiene relación con la respuesta que te ofrecí el jueves pasado en relación a la conversación En propiedades del proyecto hay una opción Convertir aplicación de instancia única ¿dónde se puede ver el código que hace esa conversión?, observa que se llama al método Dispose del objeto Process tanto en el método PrevInstance.Process como en el método PrevInstance.Activate, y antes de que estos métodos finalicen.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.






    domingo, 6 de noviembre de 2016 7:48
    Moderador
  • Gracias por la respuesta, así es, tiene relación con su respuesta anterior, estaba revisando el código que me proporcionó y me preguntaba si era posible obviar algunas líneas para hacerlo aún más compacto, pero por lo que me dice (y por los enlaces que se dio el trabajo de poner -gracias por eso también- los revisé todos, el tema es amplio y encuentro que un poco complejo) veo que esas líneas que llaman a Dispose, son necesarias, en este caso.
    domingo, 6 de noviembre de 2016 18:04
  • "James-2016" escribió:

    > me preguntaba si era posible obviar algunas líneas para hacerlo aún más compacto ...

    Cuando uno escribe código para un método cualquiera, tiene que escribir las líneas necesarias para que el método cumpla con el trabajo encomendado sin fastidiar otras partes de la aplicación: ni una más pero tampoco ni una línea menos. Parece una tontería, pero puede que por "compactar el método" después no nos parezca tanta tontería y nos arrepintamos, y mucho. ;-)

    Muchas veces observo código publicado, y leo algún que otro comentario, donde parece ser que la obsesión del desarrollador es que el código tenga las mínimas líneas posibles, y a lo mejor no cae en cuenta de que eliminar 10 líneas de código equivale a dejar "vía libre" para que la aplicación pueda ser atacada por código malicioso. No quiere esto decir que sea tu caso, pero cuando uno está escribiendo código, hay que tener muy presente otros factores, como por ejemplo, la seguridad.

    Con el hardware existente hace 20 años, los métodos con muchas líneas de código podrían hacer que el programa se ralentizara en su ejecución. Pero hoy en día, que cualquier ordenador personal cuenta con gigas de RAM, procesadores de 2 o más núcleos, y de una gran cantidad de espacio en disco duro para poder grabar archivos temporales, me parece a mí que no hay que preocuparse demasiado de reducir líneas de código para que la aplicación se ejecute más rápidamente. Hay que reducir aquellas líneas de código que con total seguridad sepamos que no va a afectar a otras partes de la aplicación o del propio equipo en el que se ejecuta.

    Me viene a la mente una frase que leí hace tiempo, y cuyo autor no recuerdo en estos momentos (puede que fuera  Bruce Schneier, pero no estoy seguro), que más o menos venía a decir que "ya había demasiados sistemas rápidos pero inseguros". Pues ten siempre en mente también esta frase cuando te dé por pensar en "compactar" líneas de código, si por "compactar" entendemos eliminar líneas para que el código se ejecute "más rápidamente". ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.




    domingo, 6 de noviembre de 2016 19:17
    Moderador
  • mm buen punto, lo tendré presente.
    domingo, 6 de noviembre de 2016 20:59