2010-10-26 9 views
12

"mit" Nach MSDN LibraryConfused Anweisung using C#

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

Aber ich habe diesen Code hier von einigen Benutzern geschrieben und ich habe verwirrt darüber: (bitte meinen Kommentar auf dem Code sehen)

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

In dem obigen Code, wird die using Anweisung richtig verwendet? Ich bin verwirrt, kann jemand bitte erklären, wie man using Aussage und seine Festlegung und wann, wo und warum es zu verwenden. Danke ..

Antwort

10

Die using-Anweisung ist eine Kurzform zum manuellen Setzen eines try/finally-Blocks.

So

using(x){ 
    ... 
} 

ist die gleiche wie

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

Und sie werden die gleiche IL erzeugen, wenn zusammengestellt.

Der Compiler gibt Ihnen einen Fehler, falls xIDisposable nicht implementiert.

+0

eigentlich gleich zu wenn (x! = Null) {((IDisposable) x) .Dispose(); } - using-Anweisung (C# -Referenz) http://bit.ly/acmoOD –

+0

Ich finde es traurig, dass, nur weil ich meine Antwort eine Minute vor Ihnen veröffentlicht habe, habe ich (derzeit) zweimal die Stimmen, dies verheißt nichts Gutes für SO Deine Frage ist meiner nicht unterlegen, aber weil du nicht schnell genug gezeichnet hast, wird sie sich (wahrscheinlich) nicht über meine erheben. – Motti

+0

So funktioniert SO in dem Moment, denke ich, und ich bin mir nicht sicher, ob es auch eine schnelle "Lösung" dafür gibt. Leider fördert es schnelle Antworten statt gut durchdachte. Ich finde oft eine schnelle Antwort, auch wenn ich weiß, dass ich sie später bearbeiten muss, um nicht komplett versenkt zu werden. Ich habe über eine Weile darüber nachgedacht, und ein Vorschlag, den ich habe, ist, dass, nachdem eine Frage bekanntgegeben wurde, keine Antworten für 10 Minuten angezeigt werden, und nach 10 Minuten werden alle in diesem Zeitraum geschriebenen Antworten in zufälliger Reihenfolge angezeigt der gleiche Zeitstempel. Könnte eine gute Idee sein;) –

11

Die finally Block (und damit in diesem Fall der try) ist überflüssig, das ist, was using tut, ruft sie Dispose auf das IDisposable Objekt, mit dem es initialisiert wird, wenn die using Block endet (unabhängig von Ausnahmen oder deren Fehlen).