4 Stimmen

Richtiges Format von verschachtelten "using"-Anweisungen?

Ich habe den folgenden Satz von Code:

using (OracleConnection conn = new OracleConnection(m_fceConn))
{
    conn.Open();

    using (OracleCommand cmd = new OracleCommand(m_sql, conn))
    {
        using (OracleDataReader reader = cmd.ExecuteReader())
        {
            reader.Read();
        }
    }

    conn.Close();
}

Gibt es eine bessere Möglichkeit, dies zu formatieren? Zugegeben, später werde ich wahrscheinlich das Öffnen einer Verbindung, das Ausführen einer Abfrage und das Schließen der Verbindung in separate Funktionen aufteilen, aber diese Verschachtelung wird sozusagen "hinter den Kulissen" vorhanden sein.

Ich habe in einem anderen Thread gelesen, dass ich die Dinge so formatieren kann:

using (OracleConnection conn = new OracleConnection(m_fceConn))
using (OracleCommand cmd = new OracleCommand(m_sql, conn))

Aber wenn man bedenkt, dass ich Code zwischen jeder dieser Anweisungen habe, glaube ich nicht, dass ich die Klammern so weglassen kann. Ich bin nur auf der Suche nach der besten/sichersten Praxis hier, da ich noch realtiv neu/noob zu C# bin. Danke!

3voto

Erik Funkenbusch Punkte 91649

Ich könnte mich irren, aber ich glaube nicht, dass Sie die Verbindung öffnen müssen, bevor Sie sie an OracleCommand übergeben. Sie müssen sie nur öffnen, bevor Sie einen Befehl ausführen. Sie könnten also die obige Anweisung wie folgt schreiben:

using (OracleConnection conn = new OracleConnection(m_fceConn)) 
using (OracleCommand cmd = new OracleCommand(m_sql, conn))
{ 
    conn.Open(); 
    using (OracleDataReader reader = cmd.ExecuteReader()) 
    { 
        reader.Read(); 
    } 
}

(Sie sollten auch nicht explizit schließen müssen, da das Beenden der Verbindung diese automatisch schließen sollte).

Es gibt nichts Besonderes über den obigen Code (außer, dass es schön aussieht), es ist nur mit normalen C # Regeln, die einzelne Befehle auf solche Blöcke anwenden. es ist das gleiche wie dieses:

if (...)
if (...)
   dosomething(); // Look Ma, no curly braces

es ist nur so, dass Sie mehrere einzelne Aussagen "stapeln".

2voto

Adam Robinson Punkte 176996

Das Ergebnis ist richtig formatiert, aber es ist nicht notwendig, die conn.Close() da die Verbindung am Ende des Prozesses entsorgt (und damit geschlossen) wird. using Block, der ihn deklariert hat.

Sie können jedoch die Klammern für die zweite Anweisung weglassen, da diese Anweisung in ihrer Gesamtheit nur eine weitere using Block.

2voto

Eric Andres Punkte 3397

Ihre erste using-Anweisung muss Klammern haben, da Sie die conn.Open() dort anrufen. Die zweite und dritte können gestapelt werden, wie Sie angegeben, die ziemlich idiomatisch C# ist (und bevorzugt, in meinem Fall).

0voto

using (OracleConnection conn = new OracleConnection(m_fceConn))
{
    conn.Open();

    using (OracleDataReader reader = new OracleCommand(m_sql, conn).ExecuteReader())
    {
        reader.Read();
    }

    conn.Close();
}

EDITAR Wenn ich es mir recht überlege, sollten Sie das nicht tun. Es würde das Befehlsobjekt nicht entsorgen. Ich lasse die Antwort hier als Beispiel dafür, was man NICHT tun sollte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X