Soll ich alle Einweg-Objekte entsorgen?

7

Viele Objekte in .NET ( SQLCommand zum Beispiel) implementieren IDisposable . Wenn ich eine Instanz eines IDisposable -Objekts erstelle, sollte ich dann immer darüber verfügen?

    
Foo 12.09.2013, 18:52
quelle

5 Antworten

17

Ja, es sei denn, Sie erhalten es von einem Anrufer, der es benötigt, wenn Sie fertig sind oder die Verantwortung für den Aufruf von Dispose() übernommen haben. Wichtig ist, dass jemand Dispose() aufruft und wenn Sie eine IDisposable Instanz übergeben müssen, muss ein Verständnis ("Vertrag") darüber bestehen, ob Sie dafür Eigentümer sind (und also müssen Sie es entsorgen) oder ob Sie es "leihen" und der Anrufer wird es verwenden / entsorgen es bei Ihrer Rückkehr. Dies sind die Arten von Dingen, die gute APIs in ihrer Dokumentation haben.

Wenn Sie das Objekt instanziieren, erleichtern Sie sich die automatische Entsorgung, indem Sie using .

    
Omaha 12.09.2013, 18:52
quelle
4

Achten Sie darauf, die Elemente zu entfernen, bevor sie den Umfang verlieren .

Am besten verwenden Sie die using -Anweisung, oder Sie können% manuell aufrufen co_de%, aber bevor es den Umfang verliert und für die Garbage Collection geeignet wird.

Sie sehen möglicherweise: CA2000: Objekte vor dem Verlust des Bereichs löschen

  

Wenn ein wegwerfbares Objekt nicht explizit vor allem entsorgt wird   Hinweise darauf sind außerhalb des Geltungsbereiches, das Objekt wird bei einigen entsorgt   unbestimmte Zeit, wenn der Garbage Collector den Finalizer von ausführt   das Objekt. Da ein außergewöhnliches Ereignis auftreten kann, das verhindert wird   der Finalizer des Objekts ausgeführt werden soll, sollte das Objekt sein   explizit stattdessen angeordnet.

    
Habib 12.09.2013 18:55
quelle
1

In der Regel ja. Der einfachste Weg, dies zu tun, ist normalerweise mit der using -Anweisung .

    
Tim S. 12.09.2013 18:53
quelle
1

Fast immer ja, aber hier ist ein Beispiel dafür, wenn etwas entlehnt zu Problemen führen kann. Ich habe ein Disposal-Repository mit zwei Konstruktoren erstellt, einer mit einem DbContext und einem anderen Standardkonstruktor, der den DbContext selbst erstellt. Ich stieß auf Instanzen, in denen mein Repository entsorgt werden würde, was die Beseitigung des DbContext auslösen würde (weil ich es ihm gesagt hatte), und das verursachte manchmal Probleme, weil ich den DbContext, der an anderer Stelle im Code übergeben wurde, brauchte.

>

In diesem Fall erstellt das Repository den DbContext und muss dafür verantwortlich sein und darüber verfügen, weil kein anderer Code es kann, aber wenn der DbContext durch einen anderen Code übergeben wird, sollte die Entsorgung des DbContext in der Verantwortung des Code, der es erstellt hat.

    
Jeremy Cook 12.09.2013 18:57
quelle
0

Nicht zwingend in allen Szenarien, aber es ist eine gute Vorgehensweise, ein Objekt zu entsorgen. Wenn Sie dies nicht für jedes Objekt tun möchten, verwenden Sie using {} , auf dem Disposable implementiert ist. Es wird darauf achten, das Objekt zu verschenken, wenn der Codeblock vorüber ist.

    
Amit Ranjan 12.09.2013 18:55
quelle

Tags und Links