Share via


Initialisierung und Beendigung von Komponenten

Aktualisiert: November 2007

Ihre Komponente wird von ihrem Konstruktor (SubNew in Visual Basic) initialisiert und von ihrem Destruktor (SubFinalizein Visual Basic) zerstört. Der Konstruktor Ihrer Komponente wird aufgerufen, wenn eine Instanz Ihrer Komponente erstellt wird; der Konstruktor kann danach nicht aufgerufen werden. Der Destruktor wird kurz vor der Zerstörung Ihrer Komponente durch die Garbage Collection aufgerufen, und der von ihr belegte Arbeitsspeicher wird freigegeben.

Visual Basic-Hinweis:

In früheren Versionen von Visual Basic hatten die Ereignisse Initialize und Terminate dieselbe Funktion wie der Konstruktor und der Destruktor.

Warten auf die Garbage Collection

Die Common Language Runtime ruft den Destruktor Ihrer Komponente auf, nachdem die Garbage Collection festgestellt hat, dass die Komponente nicht mehr von aktivem Code erreicht werden kann. Dies geschieht, wenn alle Verweise auf die Komponente freigegeben wurden oder wenn die einzigen Verweise auf Ihre Komponente von Objekten verwendet werden, die vom gesamten aktiven Code ähnlich isoliert sind, wie dies z. B. bei zyklischen Verweisen der Fall ist.

Da es zwischen dem Zeitpunkt, zu dem ein Benutzer die Arbeit an der Komponente beendet hat, und dem Zeitpunkt, zu dem ihr Destruktor aufgerufen wird, eine Verzögerung geben kann, wurde der Lebenszyklus von .NET Framework-Komponenten um einen zusätzlichen Schritt erweitert: Wenn Ihre Komponente Systemressourcen in Anspruch nimmt, z. B. Datenbankverbindungen oder Handles zu Windows-Systemobjekten, müssen Sie die IDisposable-Schnittstelle implementieren und eine Dispose-Methode bereitstellen, sodass der Benutzer Ihrer Komponente den Freigabezeitpunkt dieser Ressourcen wählen kann.

Lebenszyklus einer Komponente

Typeninitialisierung: Wenn die erste Instanz Ihrer Komponente erstellt wird, ist der als erstes ausgeführte Code ein gemeinsam genutzter Initialisieriungscode. Ein Verweis auf einen gemeinsam genutzten Member bewirkt außerdem, dass der gemeinsam genutzte Konstruktor ausgeführt wird. Dazu gehören alle initialisierten, gemeinsam genutzten Felder (Membervariablen) und der gemeinsam genutzte Konstruktor (SharedSubNew), falls vorhanden. Im folgenden Code wird für die gesamte Klasse eine Referenzschriftart erstellt.

Hinweis:

Shared entspricht dem Schlüsselwort static in C#. Verwechseln Sie dies nicht mit dem Schlüsselwort Static in Visual Basic.

Wann muss eine Dispose-Methode implementiert werden?

Wenn Ihre Komponente von Component erbt, wird eine Standardimplementierung von Dispose bereitgestellt. Diese Implementierung kann überschreiben werden, um einen angepassten Bereinigungscode zur Verfügung zu stellen. Wenn Sie Ihre Komponente über eine benutzerdefinierte Implementierung von IComponent erstellen, müssen Sie IDisposable implementieren, um eine Dispose-Methode für die Komponente bereitzustellen.

Sie müssen eine Dispose-Methode in Ihre Komponente implementieren, wenn sie Systemobjekte, Datenbankverbindungen oder andere knappen Ressourcen reserviert, die gleich freigegeben werden müssen, wenn die Komponente nicht mehr vom Benutzer benötigt wird.

Eine Dispose-Methode muss ebenfalls implementiert werden, wenn Ihre Komponente Verweise auf andere Objekte verwendet, die über Dispose-Methoden verfügen.

Wozu "Dispose" implementieren?

Abhängig von der Systemaktivität könnte zwischen dem Zeitpunkt, zu dem ein Benutzer Ihre Komponente nicht mehr benötigt, und dem Zeitpunkt, zu dem die Garbage Collection feststellt, dass der Code der Komponente nicht mehr erreichbar ist, ein nicht vorhersehbares Zeitintervall verstreichen. Wenn Sie keine Dispose-Methode bereitstellen, nimmt Ihre Komponente ihre Ressourcen während dieses Intervalls weiterhin in Anspruch.

Der ungünstigste Fall

Angenommen, es gäbe eine Serverkomponente, die eine Datenbankverbindung verwendet und keine Dispose-Methode besitzt. Auf einem Server mit viel Arbeitsspeicher könnten Sie viele Instanzen der Komponente erstellen und freigeben, ohne dass dies erhebliche Auswirkungen auf den freien Arbeitsspeicher haben würde. In diesem Fall würden die Komponenten wahrscheinlich eine Zeit lang, nachdem die Verweise darauf freigegeben wurden, nicht von der Garbage Collection zerstört.

Schließlich könnten alle verfügbaren Datenbankverbindungen von Komponenten belegt sein, die zwar freigegeben, aber nicht zerstört wurden. Selbst wenn der Server noch über genügend Arbeitsspeicher verfügen würde, könnte er keine Benutzeranforderungen beantworten.

Siehe auch

Aufgaben

Gewusst wie: Erstellen und Konfigurieren von Komponenten im Entwurfsmodus

Konzepte

Merkmale der Komponentenklassen

Änderungen bei der Komponenteninstanziierung in Visual Basic

Referenz

Dispose

Finalize