2010-10-26 10 views
12

Según MSDN Libraryconfuso que usa el "uso" Boletín C#

using Statement (C# Reference)
Defines a scope, outside of which an object or objects will be disposed.

Pero tengo este código publicado aquí por algunos usuarios y llegué confundido acerca de esto: (por favor ver mi comentario sobre el código)

using (OleDBConnection connection = new OleDBConnection(connectiongString)) 
      { 
       if (connection.State != ConnectionState.Open) 
        connection.Open(); 
       string sql = "INSERT INTO Student (Id, Name) VALUES (@idParameter, @nameParameter)"; 

       using (OleDBCommand command = connection.CreateCommand()) 
       { 
        command.CommandText = sql; 
        command.CommandType = CommandType.Text; 

        OleDBParameter idParameter = command.CreateParameter(); 
        idParameter.DbType = System.Int32; 
        idParameter.Direction = Parameterdirection.Input; 
        idParameter.Name = "@idParameter"; 
        idParameter.Value = studentId; 

        OleDBParameter nameParameter = command.CreateParameter(); 
        try 
        { 
         command.ExecuteNonQuery(); 
        } 
        finally 
        { 
         // Is it still necessary to dispose these objects here? 
         command.Dispose(); 
         connection.Dispose(); 
        } 
       } 
      } 

En el código anterior, ¿se usa correctamente la declaración using? Estoy confundido, ¿alguien puede explicar cómo usar la declaración using y su alcance y cuándo, dónde y por qué usarlo? Gracias ..

Respuesta

10

La sentencia using es una abreviatura para poner manualmente un bloque try/finally.

Así

using(x){ 
    ... 
} 

es la misma que

try{ 
    ... 
}finally{ 
    if(x != null){ x.Dispose(); } 
} 

y generarán el mismo IL cuando se compila.

El compilador le dará un error en caso de que x no implemente IDisposable.

+0

realmente igual a if (x! = Null) {((IDisposable) x) .Dispose(); } - using Statement (C# Reference) http://bit.ly/acmoOD –

+0

Me parece triste que solo porque he publicado mi respuesta un minuto antes tengo (actualmente) el doble de votos, esto no es un buen augurio para SO , tu pregunta no es inferior a la mía de ninguna manera, pero como no dibujaste lo suficientemente rápido (probablemente) no se elevará por encima de la mía. – Motti

+0

Así es como funciona SO en este momento, y no estoy seguro si hay una "solución" rápida para eso tampoco. Lamentablemente, promueve respuestas rápidas en lugar de respuestas bien pensadas. A menudo me encuentro escribiendo una respuesta rápida, incluso si sé que voy a tener que editarla más adelante para no quedar completamente hundida. He pensado en esto por un tiempo, y una sugerencia que tengo es que después de que se publique una pregunta, no se muestren las respuestas durante 10 minutos, y luego de 10 minutos todas las respuestas escritas en este período se muestran en orden aleatorio con la misma marca de tiempo Puede ser una buena idea;) –

11

El finally bloque (y por lo tanto en este caso el try) es redundante, eso es lo using hace, llama Dispose en el objeto IDisposable con el que se inicia cuando los using extremos de bloque (independientemente de excepciones o falta de eso).

Cuestiones relacionadas