Wenn ich C # 'using' Anweisung mit der Funktion eines benutzerdefinierten Objekts verwende, muss ich IDisposable implementieren?

8

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?

    
zulkamal 27.05.2009, 10:31
quelle

8 Antworten

12

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%     
Marc Gravell 27.05.2009, 10:33
quelle
5

Es wird funktionieren, aber nach dem using {} bleibt ein sqlConn übrig, das intern eine Disposed SqlConnection enthält. Keine wirklich nützliche Situation

    
Henk Holterman 27.05.2009 10:36
quelle
1

Dein Code ist falsch!

sollte etwas wie das sein:

%Vor%

Auf diese Weise wird die using-Anweisung die Verbindung am Ende bereitstellen.

    
Pavel Nikolov 27.05.2009 10:37
quelle
1

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.

    
Yohanis 27.02.2012 20:16
quelle
1

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.

    
azheglov 27.05.2009 10:58
quelle
0

Nein, nicht, solange das zurückgegebene Objekt IDisposable ist.

Das zurückgegebene Objekt muss IDisposable nicht implementieren, aber dann würde der using-Block keinen Zweck erfüllen.

    
leppie 27.05.2009 10:32
quelle
0

Von MSDN :

  

Das dem Benutzer zur Verfügung gestellte Objekt   Anweisung muss das implementieren   IDisposable Schnittstelle.

Sie müssen Dispose () nicht aufrufen, die using-Anweisung macht das implizit für Sie.

    
annakata 27.05.2009 10:34
quelle
0

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.

Ссылка

    
Alexander Prokofyev 27.05.2009 10:39
quelle

Tags und Links