Ich habe eine sqlConnection-Manager-Klasse wie folgt:
%Vor%Wenn ich eine Funktion mit der Anweisung 'using' verwende, wie:
%Vor% Stellt die using-Anweisung die Verbindung automatisch zur Verfügung, da conn.Connection()
ein SqlConnection-Objekt zurückgibt? Oder muss ich IDisposable und eine benutzerdefinierte Dispose-Methode für die SqlConn-Klasse implementieren?
Ist das überhaupt ein guter Weg? Ich arbeite mit Legacy-Code und kann noch kein ORM verwenden, aber gibt es eine Möglichkeit, dieses bestehende Muster zum Verwalten / Erstellen von SQL-Verbindungen zu vereinfachen?
Die using
-Anweisung prüft den endgültigen Typ des Ausdrucks - d. h. was von .Connection()
zurückgegeben wird; Wenn dies etwas zurückgibt, das IDisposable
ist, dann sind Sie in Ordnung.
Der Compiler wird Ihnen sagen, wenn Sie es falsch machen ;-p (es wird Ihnen nicht using
auf etwas verwenden, das nicht IDisposable
ist).
Sie sollten wahrscheinlich darauf achten, wo Sie zwei Verbindungen erstellen:
%Vor%und möglicherweise:
%Vor% Es wird funktionieren, aber nach dem using {}
bleibt ein sqlConn übrig, das intern eine Disposed SqlConnection enthält. Keine wirklich nützliche Situation
Dein Code ist falsch!
sollte etwas wie das sein:
%Vor%Auf diese Weise wird die using-Anweisung die Verbindung am Ende bereitstellen.
Um zu verdeutlichen, was oben gesagt wird:
Jedes Objekt, das Sie für die Verwendung verwenden müssen, sollte am Ende der using-Anweisung liegen. Der Compiler muss also sicherstellen, dass Ihr Typ die IDisposable-Schnittstelle implementiert, wenn er sieht, dass er auf diesem Typ-Objekt verwendet, oder er lässt Sie nicht los.
Um Ihre Headline-Frage zu beantworten, müssen Sie IDisposable in der Klasse implementieren, deren Objekt Sie mit "using" verwenden. Andernfalls erhalten Sie einen Kompilierungsfehler.
Dann, ja, "verwenden" wird Ihre SqlConnection am Ende der Sperre entsorgen. Stellen Sie sich "using" als "try-finally" vor: Es gibt einen impliziten Aufruf von Dispose () im "finally" -Block.
Schließlich wäre sauberer Code:
%Vor%Zumindest die Leser Ihres Codes müssen sich nicht die Mühe machen, dies zu realisieren, da Henk Holterman darauf hingewiesen hat, dass Ihr SQLConn-Objekt einen Verweis auf eine entsorgte Verbindung enthält.
Es scheint, dass die Verbindung ordnungsgemäß geschlossen wird, aber dies wird nicht empfohlen:
Sie können die Ressource instanziieren Objekt und dann übergeben Sie die Variable an die using-Anweisung, aber das ist kein a beste Übung. In diesem Fall Objekt bleibt nach Kontrolle in Reichweite verlässt den Benutzungsblock, obwohl es wird wahrscheinlich keinen Zugriff mehr haben seine nicht verwalteten Ressourcen. In anderen Worte, es wird nicht mehr vollständig sein initialisiert. Wenn Sie versuchen, die Objekt außerhalb des Verwendungsblocks, Sie Risiko, das eine Ausnahme verursacht geworfen. Aus diesem Grund ist es im Allgemeinen besser zu instantiieren Objekt in der using-Anweisung und Beschränken Sie den Gültigkeitsbereich auf den using-Block.
Tags und Links c# sqlconnection idisposable