2009-02-18 27 views
5

DUPE: Uses of "using" in C#¿Cuál es el propósito del uso?

he visto gente utiliza el siguiente y me pregunto ¿cuál es su propósito? ¿Es así que el objeto se destruye después de su uso por recolección de basura?

Ejemplo:

using (Something mySomething = new Something()) { 
    mySomething.someProp = "Hey"; 
} 
+0

Duplicado de http://stackoverflow.com/questions/75401/uses-of-using-in-c – tvanfosson

+0

También se encuentra con una simple búsqueda en Google y en la documentación de MSDN. –

+0

@Charles: Y las respuestas GIYF no son en absoluto bienvenidas aquí. – GEOCHET

Respuesta

2

La instrucción using tiene el efecto beneficioso de desechar lo que está en el() cuando se completa el bloque usando.

4

La sentencia using asegura que se llama a Dispose() incluso si se produce una excepción mientras se están llamando métodos en el objeto.

2

Puede usar using cuando la clase Something implementa IDisposable. Garantiza que el objeto se elimine correctamente incluso si aciertas una excepción dentro del bloque using.

es decir, no tiene que manejar manualmente excepciones potenciales solo para llamar al Dispose, el bloque using lo hará automáticamente.

Es equivalente a esto:

Something mySomething = new Something(); 
try 
{ 
    // this is what's inside your using block 
} 
finally 
{ 
    if (mySomething != null) 
    { 
     mySomething.Dispose(); 
    } 
} 
6

Usando traduce, más o menos, a:

Something mySomething = new Something(); 
try 
{ 
    something.someProp = "Hey"; 
} 
finally 
{ 
    if(mySomething != null) 
    { 
    mySomething.Dispose(); 
    } 
} 

Y eso es prácticamente todo. El objetivo es apoyar la eliminación determinista, algo que C# no tiene porque es un lenguaje basura. Los patrones de uso/eliminación proporcionan a los programadores una forma de especificar exactamente cuándo un tipo limpia sus recursos.

+0

@Randolpho, No del todo. El objeto se crea una instancia fuera del bloque try ... finally. Si el objeto no crea una instancia, entonces no puede/no necesita eliminarse. – LukeH

+0

@Randolpho, y la IL generada también verificará que el objeto no sea nulo antes de intentar llamar a Dispose. – LukeH

+0

Buenos puntos, Luke. Prefacio con "roughly", recuerda.) – Randolpho

1

Usando se traduce en

try 
{ 
    ... 
} 
finally 
{ 
    myObj.Dispose(); 
} 

al compilar (por lo que en IL).

Así que, básicamente, debe usarlo con cada objeto que implemente IDisposable.

0

El bloque 'using' es una forma de garantizar el método 'dispose' de un objeto al salir del bloque.

Es útil porque puede salir de ese bloque normalmente, debido a pausas, porque regresó o debido a una excepción.

Puede hacer lo mismo con 'try/finally', pero 'using' hace que sea más claro lo que quiere decir y no requiere una variable declarada fuera de th block.

Cuestiones relacionadas