Muss ich SqlDataAdapter explizit entsorgen? [Duplikat]

8

In diesem Thread gibt es einen Vorschlag, der nach der Operation gemacht wird , die Instanz von SqlDataAdapter wird explizit wie folgt entsorgt.

%Vor%

Ist das wirklich nötig? Was ist mit GC?

    
Konrad Viltersten 13.08.2013, 09:36
quelle

4 Antworten

6

Es wird dringend empfohlen, IDisposable-Objekte manuell zu disponieren. Es gibt eine nette Syntaxverknüpfung dafür:

%Vor%

Auf diese Weise stellt der Compiler sicher, dass Dispose für alle Objekte aufgerufen wird, die innerhalb von "using" erstellt wurden, nachdem der Code in geschweiften Klammern die Ausführung beendet hat (dazu wird try..finally verwendet).

GC ist nicht verantwortlich für den Aufruf von Dispose für Ihre Objekte, es ist hauptsächlich Aufgabe, Objekte aus dem Heap zu sammeln, auf die nicht mehr verwiesen wird. Eine Ausnahme ist, wenn Ihre Klasse Finalizable ist. In diesem Fall stellt GC sicher, dass der Finalizer Ihres Objekts zuerst aufgerufen wird und dann wird er gesammelt. Du kannst Dispose in deinem Finalizer aufrufen und es gibt ein nettes Muster dafür, das "Dispose Method" genannt wird: Ссылка

Aber die allgemeine Regel ist (mit ein paar Ausnahmen): Wenn Sie ein Objekt instanziieren, das IDisposable implementiert, liegt es in Ihrer Verantwortung, Dispose darauf hinzuweisen.

    
Fayilt 13.08.2013, 09:58
quelle
5

Enthalten Sie im Codebeispiel den MSDN-Artikel für SqlDataAdapter-Klasse

%Vor%

Die SqlConnection ist in einer using-Klausel gekapselt, nicht jedoch in SqlDataAdapter.

Also würde ich es tun, es ist nicht erforderlich.

Das heißt, einige neigen sich zu Wenn es IDisposable implementiert, entsorgen Sie es .

In diesem Fall können Sie den SqlDataAdapter auch in eine Anweisung einfügen. Von diesem verlinkten Artikel:

  

Wenn Sie ein IDisposable-Objekt verwenden, sollten Sie in der Regel deklarieren und   instanziieren Sie es in einer using-Anweisung.

    
Adriaan Stander 13.08.2013 09:45
quelle
2

In der Regel ... ja, das tust du.
Es gibt einige Fälle, in denen der Aufruf von Dispose nicht erforderlich ist. Diese Fälle basieren jedoch auf Implementierungsdetails und sollten nicht als allgemeiner Ansatz betrachtet werden.

Einweg ist nicht über Müllsammlung. Es geht um deterministische Ressourcenbereinigung. Diese Dinge sind Paralleluniversen.

GC kann Objekte sammeln, die IDisposable ohne Aufruf von Dispose implementieren. Aber wenn dieses Objekt zum Beispiel ein Betriebssystem-Handle enthält, gibt es zwei Möglichkeiten: entweder Handle sofort freigeben (Aufruf Dispose ) oder auf Finalizer warten (aber wenn der Finalizer ausgeführt wird, kann nur GC erkannt werden).

Wenn Ihre Ressource verwaltet wird, sind die Dinge noch schlimmer.
Verwaltete Ressourcen sollten nicht in Finalizern freigegeben werden. Daher ist die Bereinigung aller Ressourcen eine Aufgabe der Methode Dispose . Wenn Sie Dispose nicht aufrufen, werden verwaltete Ressourcen niemals bereinigt (das beliebteste Beispiel ist eine Ereignisabmeldung), was Sie zu Speicherlecks führt.

    
Dennis 13.08.2013 09:47
quelle
1
%Vor%

Wenn Sie das Ende des Blocks erreicht haben, wird es für Sie entsorgt.

    
Aaron 13.08.2013 09:47
quelle

Tags und Links