Frage

Ich versuche, die Lebensdauer des tmpTabPages im folgende Stück Code, um herauszufinden. Nehmen wir an, das Formular ein leeres TabControl hat MyTabControl genannt, dass eine Sammlung gibt es genannt von Strings NameCollection.

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    For Each itm In NameCollection
        Dim tmpTabPage as New TabPage(itm.toString)

        'Add Controls to tmpTabPage

        MyTabControl.TabPages.Add(tmpTabPage)
    Next
End Sub

Da der Umfang der tmpTabPage ist die For / Next-Block, in der Regel ist es Lebensdauer bis zum Ende des Blocks richtig wäre? Aber da es zu einer Sammlung hinzugefügt, die einen Bereich außerhalb des Blockes hat funktioniert es die gleiche Lebensdauer wie die Sammlung erhalten, oder in diesem Fall der MyTabControl? Schließlich, wenn ich MyTabControl.TabPages.Clear nennt der tmpTabPages in der Sammlung zerstört wird oder werden sie nur herumsitzen Speicher aufnehmen?

War es hilfreich?

Lösung

Die große Sache über Klassen von Control abgeleitet (einschließlich TabPage) ist die Methode Dispose (). Sie sind immun gegen automatische Garbage Collection, WinForms hält eine interne Tabelle, die den Griff eines Steuer an die Steuerreferenz abbildet. Deshalb sagen wir, hat Ihr Hauptformular nicht plötzlich Müll gesammelt bekommen, auch wenn Ihr Programm nicht einen Verweis auf sie nicht halten.

Das Hinzufügen der TabPage zu der Sammlung TabControl die kümmert sich um die automatische Entsorgung. Das gleiche gilt für die TabControl, wäre es das Controls-Auflistung des Formulars hinzugefügt werden. Die normale Kette von Ereignissen ist, dass entweder das Programm oder der Benutzer das Formular schließt. Die Form-Klasse durchläuft seine untergeordneten Steuerelemente und ruft ihre Dispose () -Methode. TabControl macht das Gleiche in seiner Dispose () -Methode, die Registerkarten zu entsorgen. Die Windows-Fenster in dem Prozess zerstört werden, den Griff aus dieser Zuordnungstabelle zu entfernen und jetzt so dass der Garbage Collector schließlich sammeln, um die verwalteten Wrapper für die Kontrollen.

Es ist eine böse Falle, die viele WinForms-Programmierer in Schwierigkeiten gerät. Wenn Sie ein Steuerelement aus der übergeordneten Sammlung entfernen dann erhalten Sie die Verantwortung, die sie selbst für die Entsorgung. Entfernen tut es nicht automatisch entsorgen. WinForms hält das native Fenster am Leben, indem vorübergehend die Steuerung zu einem versteckten Fenster, um das „Park Fenster“ genannt wieder parenting. Nettes Feature ermöglicht es Ihnen, eine Kontrolle von einem Elternteil zum anderen zu bewegen, ohne zu zerstören, mit und neu erstellen die Kontrolle.

Aber das Schlüsselwort gibt es „vorübergehend“. Es ist nur vorübergehend, wenn Sie die Steuerung als nächstes Reparent. So wird es vom Parkplatz Fenster in die neuen Mutter bewegt. Wenn Sie es eigentlich nicht Reparent dann wird es für immer auf dem Parkplatz Fenster am Leben bleiben. Verschlang Ressourcen, bis das Programm beendet wird. Dies ist nichts anderes als ein Leck bekannt. Es kann Ihr Programm zum Absturz bringen, wenn Windows ein anderes Fenster erstellen verweigert, wenn Sie bereits 10.000 von ihnen erstellt haben.

Die ControlCollection.Clear () -Methode ist hier besonders schädlich. Es tut nicht die Bedienelemente verfügen, sie alle zu diesem Parkplatz Fenster bewegt bekommen. Wenn das nicht beabsichtigt, es selten ist, müssen Sie selbst entsorgen () auf sie nennen.

Andere Tipps

Objekte in .NET werden für die Garbage Collection berechtigt, wenn es keinen Weg, um sie zu bekommen. In diesem Fall gibt es wird ein Weg sein, auf dem TabPage über die TabPages Sammlung bekommen, bis er entweder aus der Sammlung oder der Registerkarte Löschungen selbst für die Sammlung in Anspruch genommen werden.

Nun, wenn ein Objekt für die Garbage Collection in Anspruch genommen werden, das heißt noch lange nicht, dass es Müll sofort gesammelt - die Garbage Collection läuft zu verschiedenen Zeiten nach einigen ziemlich komplexen Heuristiken, und es gibt auch „Generationen“ von Speicher, der die Dinge schwieriger vorherzusagen.

Aber im Grunde:

  • Sie haben keine Sorgen zu machen brauchen, dass ein Objekt, das zu einer Sammlung hinzugefügt wurde auf mysteriöse Weise und verursachen Probleme gesammelt werden
  • Sie müssen in der Regel keine Sorgen machen, dass Objekte für immer ein Speicherleck wird. Sicherlich gibt es Situationen, in denen Sie tun Notwendigkeit, einige aktive Schritte zu ergreifen, um sicherzustellen, dass ein Objekt für die Sammlung geeignet ist, wenn Sie nicht mehr verwenden, aber sie sind relativ selten. (In der Regel werden sie im Zusammenhang mit statischen Variablen und / oder Ereignissen, in meiner Erfahrung).

da soemthing einen Verweis auf die Kontrollen hat sie nicht entsorgt werden.

Ja würde die Lebensdauer bis zum Ende des Verfahrens, wenn man nicht einen Verweis auf sie auf die colelction Zugabe wurden.

die klare werden die Objekte aus der Sammlung entfernen und sie werden Müll zur Verfügung gestellt bekommen Es fallen keine anderen Verweise auf sie (die es in der Lage sein shuoldnt Sie beschreiben)

Sie fügen nur eine Referenz des TabPage Objekt in die Sammlung nicht das Objekt TmpTabPage. Das tmpTabPage Objekt in diesem Fall, dass Sie es verwenden, nur für das Zuweisen von Speicher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top