Usando la statement de uso en c #

Posible duplicado:
¿Qué es el bloque C # Using y por qué debería usarlo?

He visto la statement de uso utilizada en el medio de un bloque de código ¿cuál es la razón para esto?

La syntax de uso puede (debería) utilizarse como una forma de definir un scope para cualquier cosa que implemente IDisposable . La instrucción using garantiza que se llama a Dispose si se produce una excepción.

//the compiler will create a local variable //which will go out of scope outside this context using (FileStream fs = new FileStream(file, FileMode.Open)) { //do stuff } 

Alternativamente, puedes usar:

  FileStream fs; try{ fs = new FileStream(); //do Stuff } finally{ if(fs!=null) fs.Dispose(); } 

Lectura adicional de MSDN

C #, a través del Common Language Runtime (CLR) de .NET Framework, libera automáticamente la memoria utilizada para almacenar objetos que ya no son necesarios. La liberación de memoria no es determinista; la memoria se libera siempre que el CLR decide realizar la recolección de basura. Sin embargo, generalmente es mejor liberar recursos limitados como manejadores de archivos y conexiones de red lo más rápido posible.

La instrucción using le permite al progtwigdor especificar cuándo los objetos que usan recursos deberían liberarlos. El objeto proporcionado a la instrucción using debe implementar la interfaz IDisposable. Esta interfaz proporciona el método Dispose, que debería liberar los recursos del objeto.

A menudo se usa al abrir una conexión a una secuencia o una base de datos.

Se comporta como un bloque try {…} finally {…}. Después del bloque de uso , el objeto IDisposable que se instancia en el paréntesis se cerrará correctamente.

 using (Stream stream = new Stream(...)) { } 

Con este ejemplo, la transmisión se cierra correctamente después del locking.

usar es, finalmente, suger sintáctico para cualquier cosa que tenga un IDisposable … como una sqlconnection. Su uso asegura que algo se elimine una vez que esté fuera del scope using(){} .

 using(SqlConnection conn = new SqlConnection(connString)) { //use connection } //shorter than SqlConnection conn = new SqlConnection(connString) try { //use connection } finally { conn.Dispose(); } 

La instrucción de uso asegura que un objeto se elimina correctamente una vez que ya no se necesita. Básicamente le ahorra escribir obj.Dispose (); y proporciona una guía visual sobre el scope y el uso de una variable.

Vea la página MSDN para más información

Esta forma de usar tiene que ver con liberar recursos. Solo se puede usar en combinación con la clase que implementa la interfaz IDisposable.

ejemplo:

 using(SqlConnection conn = new SqlConnection(someConnectionString)) { //Do some database stuff here } 

al final de la conexión del bloque de uso. Se llama a Deshacer, incluso si se lanzó una excepción dentro del bloque. En el caso de un objeto SwqlConnection significa que la conexión siempre está cerrada.

Una desventaja de esta construcción es que ahora hay forma de saber qué sucedió.

Espero que esto ayude a responder tu pregunta?

Cada vez que su código crea un objeto que implementa IDisposable, su código debe hacer la creación dentro de un bloque de uso, como se ve arriba.

Hay una excepción a esta regla. Un error en el diseño de las clases de proxy de WCF evita que el uso de sentencias sea útil para las clases de proxy. En resumen, el método Dispose en una clase proxy puede generar una excepción. El equipo de WCF no vio ninguna razón para no permitir esto.

Desafortunadamente, no ver una razón no significa que no haya ninguna razón:

 try { using (var svc = new ServiceReference.ServiceName()) { throw new Exception("Testing"); } } catch (Exception ex) { // What exception is caught here? } 

Si la llamada Dispose implícita arroja una excepción, entonces el bloque catch captará esa excepción en lugar de la lanzada dentro del bloque using .