Wenn ich ein Bild in einem PictureBox-Steuerelement ersetze, sollte ich das Originalbild zuerst entfernen? .Net Winforms

8

Nach meine Frage hier , wenn ich ein Bild in einer Bildbox ersetze, sollte ich das Originalbild zuerst entsorgen?

Oder was ist mit dieser Situation:

%Vor%

Muss bm nur am Ende angeordnet werden oder sollte es vor jeder Neuerstellung entsorgt werden?

Danke für die Antworten. Ein großes Versehen meinerseits. Ich wusste, dass eine Kontrolle sich darum kümmerte, ihre Kinder zu entsorgen, aber es war mir nicht in den Sinn gekommen, dass ich ein altes Bild entsorgen sollte, wenn ich es ersetzen würde.

    
Jules 10.04.2010, 12:03
quelle

4 Antworten

5

Ja, Sie sollten das alte Objekt entfernen, bevor Sie ein neues Bild über der gleichen Variablen erstellen. Wenn Sie ein neues Bild mit derselben Variablen erstellen, entfernen Sie einen Verweis darauf. Wenn es keine Referenzen auf das alte Objekt gibt, bedeutet dies, dass es vom GC (Garbage Collector) abgeholt werden sollte. Obwohl dies "theoretisch" dazu führen sollte, dass der Speicher freigegeben wird, vorausgesetzt, dass der Finalizer dafür sorgt, dass nicht verwaltete Ressourcen berücksichtigt werden, ist dies eine große Annahme (Sie können nicht wirklich davon ausgehen, dass der Finalizer aufgerufen wird). und es verursacht mehr Arbeit für das System. Nicht standardmäßige Finalizer verursachen zusätzliche Arbeit für den GC in Bezug auf die Garbage-Collection-Level-Promotion, was dazu führt, dass die Freigabe des Speichers länger dauert und die Anzahl der Male, die der GC dazu ausgeführt werden muss.

Dies setzt voraus, dass alles geschrieben wurde, um sicherzustellen, dass der Finalizer es verarbeitet. Jedes Mal, wenn ein Objekt eine Dispose-Methode hat (alles, was IDisposable implementiert, was BitMap tut), sollte es aufgerufen werden, bevor die Referenz auf das Objekt entfernt wird (außerhalb des Gültigkeitsbereichs, Verweis auf das Objekt usw.).

Hier ist ein Artikel darüber, wie der Garbage Collector in .net

funktioniert

Ссылка

Hier ist, wie MS sagt, dass der Dispos / Finalizer implementiert werden sollte:

Ссылка

    
kemiller2002 10.04.2010, 12:08
quelle
2

Ja, das solltest du. Es implementiert IDisposable.
Als allgemeine Faustregel gilt: Entsorgen Sie alle Objekte, die IDisposable implementieren. Überlassen Sie es nicht GC.

    
ata 10.04.2010 12:08
quelle
2

Muss bm nur am Ende angeordnet werden oder sollte es vor jeder Neuerstellung entsorgt werden?

Es sollte vor jeder "Erholung" entsorgt werden. Verwechseln Sie ein Objekt nicht mit einer Objektreferenz. "new Bitmap" erstellt ein neues Objekt. "bm" ist eine Referenz, die zufällig auf dieses Objekt zeigt. Sie sind nicht gleich. Sie "erstellen" hier kein Objekt neu - Sie erstellen ein neues Objekt und löschen dann alle Referenzen auf das vorherige Objekt, was bedeutet, dass ich irgendwann in der (nahen) Zukunft Müll gesammelt werde.

    
Dan Byström 10.04.2010 12:32
quelle
2

Wenn das mit PictureBox verknüpfte Bild geändert wird, sollte man Dispose auf dem Bild aufrufen, das vorhanden war, und nur dann, wenn nichts anderes jemals dieses Bild verwenden wird. Um das zu wissen, müsste man wissen, woher das alte Bild kam. In einigen Fällen wurde das Bild nur erstellt, um dem PictureBox zugewiesen zu werden. In anderen Fällen könnte das Bild eines sein, das geteilt und / oder wiederverwendet werden soll. Wenn das Bild nur für die Zuordnung zum PictureBox erstellt wurde, sollte es Dispose d sein, wenn das PictureBox entsorgt wurde oder ein anderes Bild erhalten hat. Wenn das Bild geteilt oder wiederverwendet werden soll, dürfen diese Bedingungen nicht dazu führen, dass es entsorgt wird.

Der richtige Weg, um solche Probleme im Allgemeinen zu lösen, wäre für Klassen mit IDisposable -Eigenschaften (wie PictureBox , mit Image ), eine explizite SetImage -Methode zu verwenden, anstatt eine veränderbare Image -Eigenschaft zu haben und für die Methode SetImage einen Parameter anzugeben, der angibt, ob die PictureBox die Verantwortung für die Entsorgung übernehmen soll. Der Aufruf von SetImage oder Dispose für PictureBox sollte Dispose für das gehaltene Image aufrufen, wenn und nur wenn der vorherige SetImage -Ruf diese Verantwortung gegeben hat. Leider funktioniert PictureBox nicht so, aber ich würde es sehr empfehlen, das als Muster für zukünftige Klassen zu verwenden, die Sie schreiben, die IDisposable Objekte enthalten.

    
supercat 24.07.2012 23:05
quelle

Tags und Links