Comunidad .NET de Cd. Juárez

Más que un foro virtual. Más que preguntas y respuestas. Somos una comunidad
que se ayuda para producir desarrolladores profesionales de alto rendimiento.
Welcome to Comunidad .NET de Cd. Juárez Sign in | Join | Help
in Search

Question... curly braces

Last post 04-24-2010, 1:04 AM by Xint0. 2 replies.
Sort Posts: Previous Next
  •  09-30-2009, 9:18 AM 2228

    Question... curly braces

    Normalmente yo le tiro más al C#, por mi [poca] experiencia en C/C++, que al
    Visual Basic, me encontré con una disyuntiva sobre que sucede con los objetos
    creados en un código como el siguiente:

        {
            StreamReader sr = new StreamReader (@"blablabla/file.ext");
           
            //Hacer algo con el streamReader...
        }

     Traduciéndolo a VB con la herramienta de developerfusion, me arroja en VB:

        If True Then
            Dim sr As New StreamReader("blablabla/file.ext")
       
            'Hacer algo con el streamReader
        End If

    El rollo es, que si al llegar al "}", o "End If", el garbage collector se encarga de
    "reciclar" la memoria de los objetos creados... Sé que existe el using, que me
    asegura que así suceda, pero me entró la duda si el GC recupera la memoria
    utilizada dentro de las llaves...

    El motivo de la pregunta es que después del "}" las variables declaradas, como
    debería suceder, están fuera de scope... por  esto es que estoy dudando que
    le sucede a la memoria ocupada de estas variables...

    Am... antes de que Carlos me mande al... google, porque no responder aquí
    las inquietudes y que mejor el google venga a esta página buscando respues-
    tas en lugar de que sea al revés? Wink

    Thks!


    Se vende agua deshidratada
  •  03-15-2010, 9:48 PM 2312 in reply to 2228

    Re: Question... curly braces

    jajaja, pues dada la abundancia de respuestas (más vale tarde que nunca) aquí te va la mía (sin albur):

    En efecto, las llaves { } son una manera explícita de definir el contexto (scope) de un pedazo de código.   Y típicamente las variables declaradas en ese contexto son liberadas al salir de él... excepto aquellas que son referenciadas por algún otro pedazo de código.

    El garbage collector de .NET es distinto al de java que (hasta donde sé) sólo mantiene un contador de referencias.  El de .NET en realidad tiene un grafo de las referencias a cada objeto y periódicamente lo recorre para ver cuáles pueden ser liberados (incluyendo una lógica bastante sofisticada para resolver referencias circulares).  

    Así que el usar el using es la mejor manera de expresar "esta variable solo la uso aquí" para facilitarle las cosas al GC.

    Espero ayude. 

     


    Diario de un Dotnetero
  •  04-24-2010, 1:04 AM 2341 in reply to 2312

    Re: Question... curly braces

    El bloque using aplica para instancias de clases que implementan la interfaz IDisposable y su función es asegurarse de que se ejecute el método Dispose para que la instancia libere los recursos asociados a esta.

    Por lo general, las clases que implementan la interfaz IDisposable son aquellas que utilizan recursos no administrados y por lo tanto fuera del alcance del recolector (GC). Por lo tanto, la mejor práctica es utilizar un bloque using cada vez que se utiliza una clase que implementa la interfaz IDisposable, tales como StreamReader, Form, etc.


    Xint0

    The Xint0 Code
View as RSS news feed in XML
Powered by Community Server (Personal Edition), by Telligent Systems