2010-10-26 31 views
12

Selon MSDN LibraryConfused avec « l'aide » Déclaration C#

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

Mais je suis arrivé ce code affiché ici par un utilisateur et je suis confus à ce sujet: (s'il vous plaît voir mon commentaire sur le code)

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

Dans le code ci-dessus, l'instruction using est-elle correctement utilisée? Je suis confus, quelqu'un peut-il s'il vous plaît expliquer comment utiliser using déclaration et sa portée et quand, où et pourquoi l'utiliser. Merci ..

Répondre

10

L'instruction using est un raccourci pour mettre manuellement un bloc try/finally.

Alors

using(x){ 
    ... 
} 

est le même que

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

Et ils généreront le même IL lors de la compilation.

Le compilateur vous donnera une erreur si le x n'implémente pas IDisposable.

+0

effectivement identique à if (x! = Null) {((IDisposable) x) .Dispose(); } - using Statement (Référence C#) http://bit.ly/acmoOD –

+0

Je trouve triste que juste parce que j'ai posté ma réponse une minute avant que je n'ai (actuellement) deux fois les votes, cela ne présage rien de bon pour SO , votre question n'est en aucun cas inférieure à la mienne, mais parce que vous n'avez pas dessiné assez vite (probablement) elle ne dépassera pas la mienne. – Motti

+0

C'est comme ça que ça fonctionne pour le moment, je suppose, et je ne suis pas sûr qu'il y ait une "solution" pour ça non plus. Malheureusement, il promeut des réponses rapides plutôt que des réponses réfléchies. Je me retrouve souvent à écrire une réponse rapide même si je sais que je vais devoir l'éditer plus tard pour ne pas être complètement coulé. J'ai réfléchi à cela pendant un moment, et une suggestion que j'ai est qu'après qu'une question soit postée, aucune réponse ne sera montrée pendant 10 minutes, et après 10 minutes toutes les réponses écrites dans cette période sont montrées dans un ordre aléatoire avec le même horodatage. Cela pourrait être une bonne idée;) –

11

Le bloc finally (et donc dans ce cas, le try) est redondant, c'est ce que using fait, il appelle Dispose sur l'objet IDisposable avec lequel il est initialisé lorsque les extrémités du bloc using (quelle que soit d'exceptions ou l'absence de).