Der Aufruf von Dispose() vs wenn Sie ein Objekt geht aus Umfang/Methode abgeschlossen ist
Habe ich eine Methode, die eine try/catch/finaly
block im inneren. Innerhalb des try-Blocks, erkläre ich SqlDataReader
wie folgt:
SqlDataReader aReader = null;
aReader = aCommand.ExecuteReader();
In der finally
block, die Objekte, die manuell entsorgt werden, sind diejenigen, die sich auf die Klassenebene. Also Objekte in der Methode, die für die Einführung IDisposable
wie SqlDataReader
oben, bekommen Sie automatisch entsorgt? Close()
heißt auf aReader
nach einer while-Schleife wird ausgeführt, um die Inhalte auf dem reader (die sollte Dispose()
wie nennt Close()
). Wenn es keinen Ruf zu Close()
würde dieses Objekt geschlossen werden/automatisch vernichtet, sobald die Methode beendet ist oder das Objekt außerhalb des Gültigkeitsbereichs?
EDIT: ich bin mir bewusst, das using
statement, aber es gibt Szenarien, die sind verwirrend mich.
InformationsquelleAutor csharpdev | 2009-12-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, die Objekte werden nicht automatisch freigegeben, wenn Sie gehen out of scope.
Sind Sie nicht einmal garantiert werden entsorgt, wenn Sie Müll gesammelt, obwohl viele
IDisposable
Objekte implementieren eine "fallback" finaliser, um sicherzustellen, dass Sie schließlich entsorgt.Sind Sie verantwortlich für die Sicherstellung, dass alle
IDisposable
Objekte entsorgt werden, vorzugsweise durch wickeln Sie Sie in einblock.
InformationsquelleAutor LukeH
Sollten Sie eine
using {...}
block wickeln Sie Ihre IDisposable-Objekten in derDispose()
- Methode (die für SqlDataReader geht aus derClose()
- Methode) wird aufgerufen, wenn der using-block beendet. Wenn Sie nicht verwendenusing
ist, wird das Objekt nicht werden automatisch freigegeben, wenn Sie den Bereich verlässt - es wird an das Objekt finalizer, sofern vorhanden, um loszuwerden, Ressourcen, wenn es die garbage CollectionInformationsquelleAutor thecoop
Die Dispose-pattern nicht geben keine Garantien darüber, welche Objekte rufen Sie Dispose auf die anderen Objekte; es kann manchmal passieren, aber Sie sollten nicht Pflege. Stattdessen ist es Ihre Verantwortung, sicherzustellen, dass Dispose() wird aufgerufen, für alle IDisposable-Objekten. Der beste Weg, dies zu tun ist mit der
using
- Anweisung. Zum Beispiel:InformationsquelleAutor RickNZ
Ich Stimme mit allen oben. Sie sollten sicherstellen, dass Sie rufen
Dispose()
sich selbst, und der einfachste Weg dazu ist mit derusing
- Anweisung (Sie können dies auch tun, selbst in derfinally
block - dies ist Ausführlicher, aber manchmal notwendig). Wenn Sie dies nicht tun, können Sie finden Ihre Anwendung undicht nicht verwaltete Ressourcen wie Griffe, oder gar nicht verwalteten Speicher, vor allem, wenn irgendwo unter all dieser einige COM-Komponenten eingesetzt werden oder Anrufe getätigt, in der Win32-API. Das kann natürlich führen zu performance-und Stabilitäts-Probleme sowie übermäßige Ressourcennutzung.Nur, weil Objekte, die zur Umsetzung von
IDisposable
"sollte" implementieren Sie ein finaliser, ruft IhreDispose(bool disposing)
Methode, um nicht verwaltete Ressourcen frei, ist keine Garantie dafür, dass dies geschehen wird, so werden Sie bestimmt nicht auf ihn verlassen. Siehe, zum Beispiel, http://msdn.microsoft.com/en-us/library/b1yfkh5e%28VS.71%29.aspx für mehr Informationen über diesen Punkt.Auch noch etwas anderes zu Bedenken ist, dass, wenn die Art Ihrer Mitglieder, sind Einweg, Ihre Art, sollten Sie entweder anwenden
IDisposable
(es sei denn der Lebenszyklus diejenigen Mitglieder, die verwaltet wird durch eine andere Art, die offensichtlich könnte schmutzig werden), oder, wenn Sie nur solche Mitglieder in einer Methode, oder Sie implementieren eine bestimmte Funktionalität, die man erwägen sollte, Sie zu lokalen Variablen/Parameter in den Methoden, die Sie verwenden.InformationsquelleAutor Bart Read
Ich bin verwirrt durch die Aussage "In der finally-block, die Objekte, die manuell entsorgt werden, sind diejenigen, die sich auf Klassen-Niveau." Durch Objekte, die auf Klassen-Ebene, meinst du die Felder? Sie sollte wohl nicht sein, entsorgen Sie diese in eine gewöhnliche Methode, weil dann die Laufzeit der Felder ist nicht vorhersehbar, und hängt davon ab, welche Methoden Sie zufällig genannt haben. Es wäre besser, zu implementieren IDisposable und entsorgen Sie die Felder in Ihrer Dispose-Methode.
InformationsquelleAutor Polyfun
Könnte die Verwenden - Anweisung helfen?
InformationsquelleAutor Breandán