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.
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
funktioniertHier ist, wie MS sagt, dass der Dispos / Finalizer implementiert werden sollte:
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.
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.
Tags und Links .net c# winforms vb.net idisposable