Erstellen eine IDisposable-Klassen in c#, die bereinigt, die eine SqlConnection-Instanz, wenn Sie fertig sind mit
In einer Antwort auf eine Vorherige Frage jemand empfohlen:
haben Sie die SqlConnection-eine member-variable der Klasse, sondern die Klasse IDisposable und entsorgen Sie die SqlConnection-wenn die Klasse entsorgt
Ich haben zusammen eine Umsetzung dieser Anregung (unten), aber wollte überprüfen, dass diese Implementierung korrekt ist (offensichtlich ist es derzeit nicht tun, alles, außer die Verbindung, aber die Idee ist, dass es Methoden gibt, die möchten, verwenden Sie die Verbindung und die wäre in der Lage, die auf Sie angewiesen vorhandenen und offen).
public class DatabaseRecord : IDisposable
{
protected SqlConnection connection;
public DatabaseRecord()
{
connection = new SqlConnection("ConnectionString");
connection.Open();
}
//IDisposable implementation
private bool disposed;
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
connection.Dispose();
}
disposed = true;
}
}
//Destructor
~DatabaseRecord()
{
Dispose(false);
}
}
Wird das funktionieren? Werden Klassen, die die Verwendung von Instanzen von DatabaseRecord Bedürfnis, etwas besonderes zu tun oder wird die Dispose automatisch aufgerufen werden, sobald die Instanzen werden nicht mehr verwendet/referenziert wird? Ist dies effizienter/besser als mit using (var connection = new SqlConnection("...")) { }
in jeder einzelnen Methode Körper, wo der Anschluss benötigt wird?
Du musst angemeldet sein, um einen Kommentar abzugeben.
SqlConnection eine verwaltete Ressource, und sollte entsorgt werden innerhalb der
if (disposing)
block. Klassen mit Ihrer Klasse verfügen sollte es, idealerweise mit einerusing
block. Ob dies besser ist, als die einzelnenusing
Blöcke für SqlConnections hängt von den anderen Methoden dieser Klasse und wie Sie verwendet werden.if (disposing)
block (ich habe Sie nur bearbeitet jetzt die Frage, so ist es basierend auf Ihrer Reaktion) aber am Ende entschieden, nicht weil ich wollte, dass er auch entsorgt werden, wenn der Destruktor aufgerufen wurde (offensichtlich funktioniert es nicht wie, dass, obwohl!)... Ich hatte gehofft, dass die Verbraucher der Klasse sein könnte, ohne sich um die Klassen, die IDisposable-Natur. Die Tatsache, dass Sie benötigen, umusing
oder direkt anrufenDispose
schubst mich zurück in Richtung der anderen Umsetzung (ein separaterusing (new SqlConnection()){}
innerhalb jeder Methode).All die Ratschläge, die ich gesehen habe, sagt, dass
DbConnection
s gehalten werden sollte, um für die minimale Zeit, also das format, das ich lieber sehen im code, die ich bin überprüfung istconnection.Dispose()
bewegt werden sollte, umif (disposing) { ... }
block. Die Berufung desClose()
ist nicht erforderlich, daDispose()
beendet die Verbindung, wenn die Verbindung geöffnet ist.Dispose
es (oder verwenden Sieusing
), aber es scheint, dass dies nicht der Fall ist...Dies funktionieren wird, und es wird effizienter sein, dass mehrere using-Anweisungen. Der code, der verwendet die DatabaseRecord Klasse tun kann, so dass innerhalb einer Anweisung verwenden, um es automatisch gereinigt bis es beim verlassen der Schleife.
Einer Empfehlung jedoch wäre in der Dispose-Methode überprüft den Status des Connection-Objekts und schließen Sie es, wenn es noch offen ist, bevor der Aufruf von dispose.