¿Cuáles son los usos de "usar" en C#?

Resuelto ubermonkey asked hace 16 años • 29 respuestas

El usuario kokos respondió a la maravillosa pregunta sobre las características ocultas de C# mencionando la usingpalabra clave. Puedes profundizar sobre eso? ¿ Cuáles son los usos de using?

ubermonkey avatar Sep 17 '08 01:09 ubermonkey
Aceptado

El motivo de la usingdeclaración es garantizar que el objeto se elimine tan pronto como salga del alcance, y no requiere código explícito para garantizar que esto suceda.

Como en Comprensión de la declaración 'using' en C# (codeproject) y Uso de objetos que implementan IDisposable (microsoft) , el compilador de C# convierte

using (MyResource myRes = new MyResource())
{
    myRes.DoSomething();
}

a

{ // Limits scope of myRes
    MyResource myRes= new MyResource();
    try
    {
        myRes.DoSomething();
    }
    finally
    {
        // Check for a null resource.
        if (myRes != null)
            // Call the object's Dispose method.
            ((IDisposable)myRes).Dispose();
    }
}

C# 8 introduce una nueva sintaxis, denominada " usando declaraciones ":

Una declaración de uso es una declaración de variable precedida por la palabra clave de uso. Le dice al compilador que la variable que se declara debe eliminarse al final del alcance adjunto.

Entonces el código equivalente al anterior sería:

using var myRes = new MyResource();
myRes.DoSomething();

Y cuando el control sale del alcance que lo contiene (generalmente un método, pero también puede ser un bloque de código), myResserá eliminado.

paulwhit avatar Sep 16 '2008 18:09 paulwhit

Como mucha gente todavía lo hace:

using (System.IO.StreamReader r = new System.IO.StreamReader(""))
using (System.IO.StreamReader r2 = new System.IO.StreamReader("")) {
   //code
}

Supongo que mucha gente todavía no sabe que se puede hacer:

using (System.IO.StreamReader r = new System.IO.StreamReader(""), r2 = new System.IO.StreamReader("")) {
   //code
}
BlackTigerX avatar Sep 16 '2008 19:09 BlackTigerX

Cosas como esta:

using (var conn = new SqlConnection("connection string"))
{
   conn.Open();

    // Execute SQL statement here on the connection you created
}

Esto SqlConnectionse cerrará sin necesidad de llamar explícitamente a la .Close()función, y esto sucederá incluso si se lanza una excepción , sin necesidad de try// .catchfinally

Joel Coehoorn avatar Sep 16 '2008 18:09 Joel Coehoorn

El uso se puede utilizar para llamar a IDisposable. También se puede utilizar para tipos de alias.

using (SqlConnection cnn = new SqlConnection()) { /* Code */}
using f1 = System.Windows.Forms.Form;
MagicKat avatar Sep 16 '2008 18:09 MagicKat