2010-10-26 15 views
12

Secondo MSDN LibraryConfused utilizzando "usando" Dichiarazione C#

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

Ma ho ottenuto questo codice postato qui da qualche utente ed ho ottenuto confuso su questo: (si veda il mio commento sul codice)

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(); 
        } 
       } 
      } 

Nel codice precedente, l'istruzione using è stata utilizzata correttamente? Sono confuso, qualcuno può spiegare come usare l'istruzione using e il suo ambito e quando, dove e perché usarlo. Grazie ..

risposta

10

L'istruzione using è una scorciatoia per inserire manualmente un blocco try/finally.

Così

using(x){ 
    ... 
} 

è lo stesso di

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

e saranno generare la stessa IL durante la compilazione.

Il compilatore ti darà un errore nel caso in cui x non implementa IDisposable.

+0

in realtà uguale a se (x! = Null) {((IDisposable) x) .Dispose(); } - using Statement (C# Reference) http://bit.ly/acmoOD –

+0

Trovo triste che solo perché ho postato la mia risposta un minuto prima che tu abbia (attualmente) il doppio dei voti, questo non è di buon auspicio per SO , la tua domanda non è inferiore alla mia in alcun modo, ma perché non hai disegnato abbastanza velocemente (probabilmente) non sorgerà sopra il mio. – Motti

+0

Questo è il modo in cui SO funziona al momento, credo, e non sono sicuro che ci sia una "correzione" rapida per entrambi. Purtroppo, promuove risposte rapide invece di quelle ben pensate. Mi trovo spesso a scrivere una risposta veloce anche se so che avrò bisogno di modificarlo in seguito per non essere completamente affondato. Ci ho pensato per un po ', e un mio suggerimento è che dopo che una domanda è stata postata, nessuna risposta verrà mostrata per 10 minuti, e dopo 10 minuti tutte le risposte scritte in questo lasso di tempo sono mostrate in ordine casuale con lo stesso timestamp. Potrebbe essere una buona idea;) –

11

Il finally blocco (e quindi in questo caso la try) è ridondante, questo è ciò che using fa, si chiede Dispose sull'oggetto IDisposable con cui viene inizializzato quando i using blocco estremità (indipendentemente eccezioni o mancanza di ciò).