Mithilfe von C#'s 'mit' - Anweisung mit einem benutzerdefinierten Objekt-Funktion, Muss ich IDisposable implementieren?
Ich habe eine sqlConnection-manager-Klasse in etwa so:
public class SQLConn {
public string connStr = System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
private SqlConnection sqlConn;
public SqlConnection Connection()
{
sqlConn = new SqlConnection(connStr);
return sqlConn;
}
public void Open()
{
sqlConn .Open();
}
}
Wenn ich eine Funktion mit der 'mit' - Anweisung wie:
var conn = new SQLConn();
using (conn.Connection())
{
String query = "Select * from table";
objSql = new SqlCommand(query, conn.Connection());
conn.Open();
DoSomething();
}
Macht die using-Anweisung entsorgen Sie die Verbindung automatisch, da conn.Connection()
gibt eine SqlConnection-Objekt? Oder muss ich implementieren IDisposable und eine benutzerdefinierte Dispose-Methode auf die SqlConn Klasse?
Ist dies auch eine gute Möglichkeit überhaupt? Ich arbeite mit legacy-code und ich bin nicht in der Lage zu verwenden ein ORM noch aber ist es ein Weg, um dies zu vereinfachen, bestehende Muster zu verwalten/erstellen von SQL-verbindungen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
using
- Anweisung wird die Letzte Art des Ausdrucks - D. H. was auch immer zurück.Connection()
; wenn diese etwas zurückgibt, wirdIDisposable
, dann sind Sie OK.Dem compiler sagen, wenn Sie es falsch ;-p (es wird nicht lassen Sie
using
auf etwas, das nichtIDisposable
).Sollte man wohl aufpassen, wo Sie erstellen zwei Anschlüsse:
und möglicherweise:
Es funktionieren wird, aber nach der
using {}
Sie mit der linken, eine sqlConn, dass intern hält Entsorgt SqlConnection. Nicht wirklich nützlich situationDein code ist falsch!
sollte so etwas wie dieses:
Diese Weise die using-Anweisung wird über die Verbindung am Ende.
using (conn.Connection())
, sondern auch durch die Tatsache, dass dieConnection()
- Methode erstellt ein neues Objekt jedes mal, wenn es aufgerufen wird, und in dem original-Beitrag, die Verbindung, die unter der "mithilfe" ist nicht eine andere Instanz als die Verbindung tatsächlich genutzt wird, innerhalb des Blocks.Zu klären, was gesagt wird über:
Jedes Objekt, das Sie verwenden müssen, um mit der Verwendung entsorgt werden sollte am Ende der using-Anweisung. Der compiler muss daher sicherstellen, dass Ihre Art die IDisposable-Schnittstelle implementiert, wenn es sieht mit auf das Typ-Objekt, oder es wird dich nicht gehen lassen.
beantworten deine headline-Frage, Sie muss IDisposable implementieren Sie in der Klasse, deren Objekt Sie sind mit "mit". Andernfalls erhalten Sie eine compile-time-Fehler.
Dann, ja, "mit" entledigen sich Ihrer SqlConnection am Ende des Blocks. Denken Sie an "mit" als "try-finally": es gibt einen impliziten Aufruf von Dispose() in der "finally" - block.
Schließlich, sauberer code wäre:
Zumindest die Leser des Codes nicht haben, um den mentalen Aufwand zu realisieren, da Henk Holterman wies darauf hin, dass Ihre SQLConn-Objekt hält eine Referenz auf eine entsorgt-Verbindung.
Nein musst du nicht, solange das zurückgegebene Objekt ist IDisposable.
Das zurückgegebene Objekt muss nicht zu implementieren IDisposable, aber dann die using-block würde keinem Zweck dienen.
foreach
? wo ist der enumerator könnte werden Einweg - (und wenn dem so ist, wird entsorgt), aber muss nicht sein? Oder vielleicht die Tatsache, dass der zurückgegebene Wert darf null sein?Vom MSDN:
Haben Sie nicht rufen Sie die Dispose () - obwohl, die using-Anweisung implizit tut dies für Sie.
Scheint es, wird die Verbindung ordnungsgemäß geschlossen, aber dies wird nicht empfohlen:
http://msdn.microsoft.com/en-us/library/yh598w02.aspx