Objekte in Visual Basic entsorgen

click fraud protection

In dem Artikel Codieren neuer Instanzen von Objekten habe ich über die verschiedenen Möglichkeiten geschrieben, wie Neu Instanzen von Objekten können erstellt werden. Das gegenteilige Problem, ein Objekt zu entsorgen, ist etwas, über das Sie sich in VB.NET nicht oft Sorgen machen müssen. .NET enthält eine Technologie namens Müllsammler (GC), der sich normalerweise leise und effizient um alles hinter den Kulissen kümmert. Aber gelegentlich, normalerweise bei Verwendung von Dateistreams, SQL-Objekten oder Grafikobjekten (GDI +) (d. H. nicht verwaltete Ressourcen) müssen Sie möglicherweise die Kontrolle über die Entsorgung von Objekten in Ihrem eigenen Code übernehmen.

Zunächst einige Hintergrundinformationen

Genau wie ein conStrukturierer (der Neu Schlüsselwort) erstellt ein neues Objekt, ein destructor ist eine Methode, die aufgerufen wird, wenn ein Objekt zerstört wird. Aber da ist ein Fang. Die Leute, die .NET erstellt haben, haben erkannt, dass es eine Formel für Fehler ist, wenn zwei verschiedene Codeteile tatsächlich ein Objekt zerstören können. Der .NET GC hat also tatsächlich die Kontrolle und ist normalerweise der einzige Code, der die Instanz des Objekts zerstören kann. Der GC zerstört ein Objekt, wenn er sich dazu entscheidet und nicht vorher. Normalerweise ist dies der Fall, nachdem ein Objekt den Gültigkeitsbereich verlassen hat

instagram viewer
veröffentlicht durch die Common Language Runtime (CLR). Der GC zerstört Objekte, wenn die CLR mehr freien Speicher benötigt. Unter dem Strich können Sie also nicht vorhersagen, wann GC das Objekt tatsächlich zerstören wird.

(Welllll... Das ist richtig fast die ganze Zeit. Du kannst anrufen GC.Collect und Kraft a Speicherbereinigungszyklus, aber die Behörden sagen allgemein, es ist ein Schlecht Idee und völlig unnötig.)

Zum Beispiel, wenn Ihr Code eine erstellt hat Kunde Objekt, kann es scheinen, dass dieser Code es wieder zerstören wird.

Kunde = nichts

Aber das tut es nicht. (Das Setzen eines Objekts auf Nichts wird allgemein als bezeichnet. Dereferenzierung das Objekt.) Eigentlich bedeutet es nur, dass die Variable keinem Objekt mehr zugeordnet ist. Einige Zeit später wird der GC feststellen, dass das Objekt zur Zerstörung verfügbar ist.

Übrigens ist für verwaltete Objekte nichts davon wirklich notwendig. Obwohl ein Objekt wie ein Button eine Dispose-Methode bietet, ist es nicht erforderlich, es zu verwenden, und nur wenige Menschen tun dies. Windows Forms-Komponenten werden beispielsweise einem Containerobjekt mit dem Namen hinzugefügt Komponenten. Wenn Sie ein Formular schließen, wird seine Dispose-Methode automatisch aufgerufen. Normalerweise müssen Sie sich nur darum kümmern, wenn Sie nicht verwaltete Objekte verwenden, und selbst dann nur, um Ihr Programm zu optimieren.

Die empfohlene Methode zum Freigeben von Ressourcen, die möglicherweise von einem Objekt gehalten werden, ist das Aufrufen von Entsorgen Methode für das Objekt (falls verfügbar) und dann das Objekt dereferenzieren.

Kunde. Entsorgen () Kunde = nichts

Da GC ein verwaistes Objekt zerstört, unabhängig davon, ob Sie die Objektvariable auf Nothing setzen oder nicht, ist dies nicht unbedingt erforderlich.

Eine andere empfohlene Methode, um sicherzustellen, dass Objekte zerstört werden, wenn sie nicht mehr benötigt werden, besteht darin, den Code, der ein Objekt verwendet, in ein Objekt einzufügen Verwenden von Block. Ein Using-Block garantiert die Entsorgung einer oder mehrerer solcher Ressourcen, wenn Ihr Code damit fertig ist.

In der GDI + -Serie ist die Verwenden von Block wird ziemlich häufig verwendet, um diese lästigen Grafikobjekte zu verwalten. Zum Beispiel ...

Verwenden von myBrush als LinearGradientBrush _. = Neuer LinearGradientBrush (_. Mir. ClientRectangle, _. Farbe. Blaue Farbe. Rot, _. LinearGradientMode. Horizontal) <... mehr code ...> Beenden Sie die Verwendung

myBrush wird automatisch entsorgt, wenn das Ende des Blocks ausgeführt wird.

Der GC-Ansatz zur Speicherverwaltung ist eine große Änderung gegenüber VB6. COM-Objekte (von VB6 verwendet) wurden zerstört, als ein interner Referenzzähler Null erreichte. Aber es war zu leicht, einen Fehler zu machen, so dass der interne Zähler ausgeschaltet war. (Da der Speicher gebunden war und anderen Objekten nicht zur Verfügung stand, wurde dies als "Speicherverlust" bezeichnet.) Stattdessen prüft GC tatsächlich, ob etwas auf ein Objekt verweist, und zerstört es, wenn es nicht mehr vorhanden ist Verweise. Der GC-Ansatz hat eine gute Geschichte in Sprachen wie Java und ist eine der großen Verbesserungen in .NET.

Auf der nächsten Seite sehen wir uns die IDisposable-Oberfläche an... Die Schnittstelle, die verwendet werden soll, wenn Sie nicht verwaltete Objekte in Ihrem eigenen Code entsorgen müssen.

Wenn Sie Ihr eigenes Objekt codieren, das nicht verwaltete Ressourcen verwendet, sollten Sie das verwenden IDisposable Schnittstelle für das Objekt. Microsoft macht dies einfach, indem es ein Code-Snippet einfügt, das das richtige Muster für Sie erstellt.


Klicken Sie hier, um die Abbildung anzuzeigen
Klicken Sie in Ihrem Browser auf die Schaltfläche Zurück, um zurückzukehren

Der hinzugefügte Code sieht folgendermaßen aus (VB.NET 2008):

 Klasse ResourceClass. Implementiert IDisposable. 'Um redundante Anrufe zu erkennen. Privat entsorgt als Boolean = False. 'IDisposable. Geschützte überschreibbare Unterentsorgung (_. ByVal Disposing As Boolean) Wenn nicht Me.disposed Dann. Wenn dann entsorgen. 'Geben Sie einen anderen Status frei (verwaltete Objekte). End If. 'Befreie deinen eigenen Staat (nicht verwaltete Objekte). 'Setzen Sie große Felder auf null. End If. Me.disposed = True. End Sub. #Region "IDisposable Support" 'Dieser Code wurde von Visual Basic hinzugefügt. 'das Einwegmuster korrekt umsetzen. Public Sub Dispose () Implementiert IDisposable. Entsorgen. 'Ändern Sie diesen Code nicht. 'Geben Sie den Bereinigungscode ein. 'Entsorgen (ByVal Entsorgen als Boolescher Wert) oben. Entsorgen Sie (True) GC.SuppressFinalize (Me) End Sub. Protected Overrides Sub Finalize () 'Ändern Sie diesen Code nicht. 'Geben Sie den Bereinigungscode ein. 'Entsorgen (ByVal Entsorgen als Boolescher Wert) oben. Entsorgen Sie (False) MyBase. Finalize () End Sub. #End Region. Klasse beenden 

Entsorgen ist fast ein "erzwungenes" Entwicklerdesignmuster in .NET. Es gibt wirklich nur einen richtigen Weg, und das ist es. Sie könnten denken, dieser Code macht etwas Magisches. Das tut es nicht.

Beachten Sie zunächst, dass das interne Flag entsorgt Schließen Sie einfach das Ganze kurz, damit Sie anrufen können Entsorgen (entsorgen) so oft du willst.

Der Code ...

 GC.SuppressFinalize (Me) 

... macht Ihren Code effizienter, indem Sie dem GC mitteilen, dass das Objekt bereits entsorgt wurde (eine "teure" Operation in Bezug auf Ausführungszyklen). Finalize ist geschützt, da GC es automatisch aufruft, wenn ein Objekt zerstört wird. Sie sollten Finalize niemals aufrufen. Der Boolesche entsorgen teilt dem Code mit, ob Ihr Code die Entsorgung des Objekts initiiert hat (True) oder ob der GC dies getan hat (als Teil des Finalisieren sub. Beachten Sie, dass der einzige Code den Booleschen Wert verwendet entsorgen ist:

 Wenn dann entsorgen. 'Geben Sie einen anderen Status frei (verwaltete Objekte). End If 

Wenn Sie ein Objekt entsorgen, müssen alle seine Ressourcen entsorgt werden. Wenn die CLR Müllsammler Entsorgt ein Objekt, müssen nur die nicht verwalteten Ressourcen entsorgt werden, da der Garbage Collector sich automatisch um die verwalteten Ressourcen kümmert.

Die Idee hinter diesem Code-Snippet ist, dass Sie Code hinzufügen, um verwaltete und nicht verwaltete Objekte an den angegebenen Speicherorten zu verwalten.

Wenn Sie eine Klasse von a ableiten Basisklasse Wenn Sie IDisposable implementieren, müssen Sie keine der Basismethoden überschreiben, es sei denn, Sie verwenden andere Ressourcen, die ebenfalls entsorgt werden müssen. In diesem Fall sollte die abgeleitete Klasse die Dispose-Methode (Dispositionsmethode) der Basisklasse überschreiben, um die Ressourcen der abgeleiteten Klasse zu entsorgen. Denken Sie jedoch daran, die Dispose-Methode (Dispositionsmethode) der Basisklasse aufzurufen.

Geschützte Überschreibungen Sub Dispose (ByVal Disposing As Boolean) Wenn nicht Me.disposed Dann. Wenn dann entsorgen. 'Fügen Sie Ihren Code zu frei verwalteten Ressourcen hinzu. End If. 'Fügen Sie Ihren Code hinzu, um nicht verwaltete Ressourcen freizugeben. End If. MyBase. Entsorgen (entsorgen) End Sub

Das Thema kann etwas überwältigend sein. Der Zweck der Erklärung hier ist, "zu entmystifizieren", was tatsächlich passiert, weil die meisten Informationen, die Sie finden können, Ihnen nichts sagen!

instagram story viewer