Exemplarische Vorgehensweise: Erstellen einer Komponente mit Visual Basic
Komponenten enthalten wiederverwendbaren Code in Form von Objekten.Eine Anwendung, die Code einer Komponente verwendet, wenn Objekte erstellt und deren Eigenschaften und Methoden aufgerufen werden, wird als Client bezeichnet.Clients können, müssen sich jedoch nicht in derselben Assembly wie die verwendete Komponente befinden.
Die folgenden Prozeduren bauen aufeinander auf, weshalb die Reihenfolge der Prozeduren eingehalten werden sollte.
Hinweis |
---|
Je nach den aktiven Einstellungen oder der Version unterscheiden sich die Dialogfelder und Menübefehle auf Ihrem Bildschirm möglicherweise von den in der Hilfe beschriebenen.Wählen Sie im Menü Extras die Option Einstellungen importieren und exportieren aus, um die Einstellungen zu ändern.Weitere Informationen finden Sie unter Anpassen der Entwicklungseinstellungen in Visual Studio. |
Erstellen des Projekts
So erstellen Sie die CDemoLib-Klassenbibliothek und die CDemo-Komponente
Wählen Sie im Menü Datei die Option Neu, und klicken Sie auf Projekt, um das Dialogfeld Neues Projekt zu öffnen.Markieren Sie in der Liste der Visual Basic-Projekttypen die Projektvorlage Klassenbibliothek, und geben Sie im Feld Name die Zeichenfolge CDemoLib ein.
Hinweis Geben Sie bei der Erstellung eines neuen Projekts immer dessen Namen an.Dadurch werden Stammnamespace, Assemblyname und Projektname eingerichtet, und es wird sichergestellt, dass die Standardkomponente sich im richtigen Namespace befindet.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf CDemoLib und dann im Kontextmenü auf Eigenschaften.Im Feld Stammnamespace erscheint die Zeichenfolge CDemoLib.
Der Stammnamespace wird dazu verwendet, die Namen der Komponenten in der Assembly zu qualifizieren.Wenn beispielsweise zwei Assemblys Komponenten mit der Bezeichnung CDemo bereitstellen, können Sie die zu verwendende CDemo-Komponente mit CDemoLib.CDemo spezifizieren.
Schließen Sie das Dialogfeld.
Klicken Sie im Menü Projekt auf Komponente hinzufügen.Wählen Sie im Dialogfeld Neues Element hinzufügen die Option Komponentenklasse aus, und geben Sie CDemo.vb ein.in das Feld Name ein.Der Klassenbibliothek wird eine mit CDemo bezeichnete Komponente hinzugefügt.
Klicken Sie im Projektmappen-Explorer auf die Schaltfläche Alle Dateien anzeigen.Öffnen Sie den Knoten CDemo.vb, um die Datei CDemo.Designer.vb anzuzeigen.Klicken Sie mit der rechten Maustaste auf CDemo.Designer.vb, und wählen Sie im Kontextmenü Code anzeigen aus.Der Code-Editor wird geöffnet.
Beachten Sie den Codeabschnitt Inherits System.ComponentModel.Component direkt unter Partial Public Class CDemo.Dieser Abschnitt kennzeichnet die Klasse, von der die Klasse erbt.Standardmäßig erben Komponenten von der vom System bereitgestellten Component-Klasse.Die Component-Klasse stellt eine Vielzahl von Features für die Komponente bereit, z. B. die Möglichkeit, Designer zu verwenden.
Suchen Sie Public Sub New().Wählen Sie den gesamten Methodentext aus, und schneiden Sie ihn aus der Datei CDemo.Designer.vb aus, indem Sie STRG+X drücken.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf CDemo.vb, und wählen Sie im Kontextmenü Code anzeigen aus.Der Code-Editor wird geöffnet.
Fügen Sie die Auswahl in den Text der CDemo-Klasse ein.Dadurch können Sie ohne Eingriff des Designers an Neu arbeiten.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Class1.vb, und wählen Sie Löschen aus.Die in der Klassenbibliothek enthaltene Standardklasse wird gelöscht, da sie in dieser exemplarischen Vorgehensweise nicht verwendet wird.
Klicken Sie im Menü Datei auf Alle speichern, um das Projekt zu speichern.
Hinzufügen von Konstruktoren und Abschlussfunktionen
Konstruktoren steuern die Initialisierung der Komponente, und die Finalize-Methode steuert, wie die Komponente beendet wird.Der Code im Konstruktor und in der Finalize-Methode der CDemo-Klasse verwaltet eine fortlaufende Zählung der bestehenden Anzahl der CDemo-Objekte.
So fügen Sie Code für den Konstruktor und die Abschlussfunktion der CDemo-Klasse hinzu
Fügen Sie im Code-Editor Membervariablen hinzu, um eine laufende Summe der Instanzen der CDemo-Klasse zu erhalten. Fügen Sie außerdem für jede Instanz eine ID-Nummer hinzu.
Public ReadOnly InstanceID As Integer Private Shared NextInstanceID As Integer = 0 Private Shared ClassInstanceCount As Long = 0
Da die Membervariablen InstanceCount und NextInstanceID als freigegeben deklariert sind, bestehen sie nur auf Klassenebene.Alle auf diese Member zugreifenden Instanzen von CDemo verwenden dieselben Speicheradressen.Wenn im Code zum ersten Mal auf die CDemo-Klasse verwiesen wird, werden freigegebene Member initialisiert.Dies kann beim erstmaligen Erstellen eines CDemo-Objekts erfolgen, oder wenn zum ersten Mal auf einen der freigegebenen Member der Klasse zugegriffen wird.
Suchen Sie Public Sub New() und Public Sub New(Container As System.ComponentModel.IContainer), die Standardkonstruktoren für die CDemo-Klasse.In Visual Basic lauten alle Konstruktoren New.Die Komponente kann über mehrere Konstruktoren mit unterschiedlichen Parametern verfügen, alle Konstruktoren müssen jedoch die Bezeichnung Neu tragen.
Hinweis Die Zugriffsebene der Konstruktoren bestimmt, welche Clients Instanzen der Klasse erstellen können.In anderen Versionen von Visual Basic wurde die Objekterstellung durch die Instancing-Eigenschaft gesteuert. Wenn Sie bisher die Instancing-Eigenschaft verwendet haben, sollten Sie unter Änderungen bei der Komponenteninstanziierung in Visual Basic nachlesen.
Fügen Sie Sub New() folgenden Code hinzu, um die Instanzenzahl schrittweise zu erhöhen, wenn eine neue CDemo-Instanz erstellt wird, und um die ID-Nummer für die Instanz festzulegen.
Hinweis Fügen Sie den Code immer nach dem Aufruf von InitializeComponent hinzu.Zu diesem Zeitpunkt sind alle konstituierenden Komponenten initialisiert.
InstanceID = NextInstanceID NextInstanceID += 1 ClassInstanceCount += 1
Als ReadOnly-Member kann InstanceID nur im Konstruktor eingerichtet werden.
Hinweis Benutzer, die mit Multithreading vertraut sind, werden berechtigterweise einwenden, dass die Zuweisung von InstanceID und das schrittweise Erhöhen von NextInstanceID unteilbare (atomare) Operationen sein sollten.Dieses und andere Probleme im Zusammenhang mit Threading werden unter Exemplarische Vorgehensweise: Erstellen einer einfachen Multithreadkomponente mit Visual Basic veranschaulicht.
Fügen Sie die folgende Methode nach dem Ende des Konstruktors hinzu:
Protected Overrides Sub Finalize() ClassInstanceCount -= 1 End Sub
Der Speicher-Manager ruft Finalize auf, bevor er den durch das CDemo-Objekt belegten Speicher endgültig wieder in Anspruch nimmt.Die Finalize-Methode befindet sich ursprünglich an derselben Stelle wie Object, dem Stamm aller Verweistypen in der .NET-Klassenhierarchie.Indem Sie Finalize überschreiben, können Sie die Bereinigung durchführen, kurz bevor die Komponente aus dem Speicher entfernt wird.Wie Sie jedoch im Verlauf dieser exemplarischen Vorgehensweise erfahren werden, gibt es gute Gründe dafür, Ressourcen bereits zu einem früheren Zeitpunkt freizugeben.
Hinzufügen einer Eigenschaft zur Klasse
Die CDemo-Klasse verfügt nur über eine Eigenschaft, eine freigegebene Eigenschaft, über die der Client herausfinden kann, wie viele CDemo-Objekte sich zu jedem beliebigen Zeitpunkt im Speicher befinden.Methoden können auf ähnliche Weise erstellt werden.
So erstellen Sie eine Eigenschaft für die CDemo-Klasse
Fügen Sie der CDemo-Klasse die folgende Methodendeklaration hinzu, damit Clients die Anzahl der Instanzen CDemo abrufen können.
Public Shared ReadOnly Property InstanceCount() As Long Get Return ClassInstanceCount End Get End Property
Hinweis Die Syntax von Eigenschaftendeklarationen unterscheidet sich von der in früheren Versionen von Visual Basic verwendeten.Weitere Informationen zur Änderung der Syntax finden Sie unter Property Procedure Changes for Visual Basic 6.0 Users.
Testen der Komponente
Um die Komponente testen zu können, benötigen Sie ein Projekt, das diese verwendet.Bei diesem Projekt muss es sich um das erste Projekt handeln, das beim Drücken der Schaltfläche Ausführen startet.
So fügen Sie das CDemoTest-Clientprojekt als Startprojekt für die Projektmappe hinzu
Zeigen Sie im Menü Datei auf Hinzufügen, und wählen Sie Neues Projekt, um das Dialogfeld Neues Projekt hinzufügen zu öffnen.
Wählen Sie die Projektvorlage Windows-Anwendung aus, und geben Sie CDemoTest in das Feld Name ein. Klicken Sie anschließend auf OK.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf CDemoTest, und klicken Sie im Kontextmenü auf Als Startprojekt festlegen.
Damit die CDemo-Komponente verwendet werden kann, muss das Clienttestprojekt über einen Verweis auf das Klassenbibliotheksprojekt verfügen.Nachdem der Verweis hinzugefügt wurde, sollte der Testanwendung zur Vereinfachung des Gebrauchs der Komponente eine Imports-Anweisung hinzugefügt werden.
So fügen Sie dem Klassenbibliotheksprojekt einen Verweis hinzu
Klicken Sie im Projektmappen-Explorer auf die Schaltfläche Alle Dateien anzeigen.Klicken Sie mit der rechten Maustaste auf den Knoten Verweise direkt unter CDemoTest, und wählen Sie im Kontextmenü Verweis hinzufügen aus.
Wählen Sie im Dialogfeld Verweis hinzufügen die Registerkarte Projekte aus.
Doppelklicken Sie auf das Klassenbibliotheksprojekt CDemoLib.CDemoLib wird unter dem Knoten Verweise für das CDemoTest-Projekt angezeigt.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Form1.vb und dann im Kontextmenü auf Code anzeigen.
Wenn Sie CDemoLib den Verweis hinzufügen, können Sie den vollständigen Namen der CDemo-Komponente (CDemoLib.CDemo) verwenden.
So fügen Sie eine Imports-Anweisung hinzu
Fügen Sie die folgende Imports-Anweisung im oberen Bereich des Code-Editors für Form1 über der Deklaration Class hinzu:
Imports CDemoLib
Wenn Sie die Imports-Anweisung hinzufügen, können Sie den Bibliotheksnamen auslassen und auf den Komponententyp als CDemo verweisen.Weitere Informationen über die Imports-Anweisung finden Sie unter Namespaces in Visual Basic.
Erstellen und verwenden Sie jetzt ein Testprogramm, um die Komponente zu testen.
Objektlebensdauer
Das CDemoTest-Programm stellt die Objektlebensdauer in .NET Framework dar, indem es eine große Anzahl von CDemo-Objekten erstellt und freigibt.
So fügen Sie Code zur Erstellung und Freigabe von CDemo-Objekten hinzu
Klicken Sie auf Form1.vb [Entwurf], um zum Designer zurückzukehren.
Öffnen Sie in der Toolbox die Registerkarte Alle Windows Forms, und ziehen Sie von dort einen Button und einen Timer auf die Form1-Entwurfsoberfläche.
Die nicht visuelle Timer-Komponente wird auf einer separaten Entwurfsoberfläche unter dem Formular angezeigt.
Doppelklicken Sie auf das Symbol für Timer1, um eine Ereignisbehandlungsmethode für das Tick-Ereignis der Timer1-Komponente zu erstellen.Fügen Sie der Ereignisbehandlungsmethode folgenden Code hinzu.
Me.Text = "CDemo instances: " & CDemo.InstanceCount
Für jeden Teilstrich des Zeitgebers wird in der Beschriftung des Formulars die aktuelle Instanzenzahl für die CDemo-Klasse angezeigt.Der Klassenname wird als Qualifizierer der freigegebenen InstanceCount-Eigenschaft verwendet. Um auf einen freigegebenen Member zuzugreifen, muss keine Instanz von CDemo erstellt werden.
Klicken Sie auf die Registerkarte Form1.vb [Entwurf], um zum Designer zurückzukehren.
Klicken Sie mit der rechten Maustaste auf Timer1, und wählen Sie im Kontextmenü die Option Eigenschaften.Legen Sie im Eigenschaftenfenster den Wert der Enabled-Eigenschaft auf True fest.Dadurch wird der Zeitgeber gestartet, sobald das Formular erstellt ist.
Doppelklicken Sie auf den Button in Form1, um eine Ereignisbehandlungsmethode für das Click-Ereignis dieser Schaltfläche zu erstellen.Fügen Sie der Ereignisbehandlungsmethode folgenden Code hinzu.
Dim cd As CDemo Dim ct As Integer For ct = 1 To 1000 cd = New CDemo Next
Dieser Code sieht für Sie u. U. ungewöhnlich aus.Während die einzelnen Instanzen von CDemo erstellt werden, wird jeweils die vorherige Instanz freigegeben.Nachdem die For-Schleife ausgeführt wurde, ist von CDemo nur noch eine Instanz übrig.Wenn die Ereignisbehandlungsmethode existiert, wird auch diese Instanz freigegeben, da die cd-Variable den Gültigkeitsbereich verlässt.
Vielleicht haben Sie es schon vermutet: So wie hier beschrieben, wird es nicht unbedingt funktionieren.
So führen Sie die Projekte CDemoTest und CDemo aus und debuggen sie
Drücken Sie F5, um die Projektmappe zu starten.
Das Clientprojekt wird gestartet, und es wird Form1 angezeigt.In der Beschriftung des Formulars wird "CDemo instances: 0" angezeigt.
Klicken Sie auf die Schaltfläche.In der Beschriftung des Formulars müsste jetzt "CDemo instances: 1000" angezeigt werden.
Zu dem Zeitpunkt, zu dem die Ereignisbehandlungsprozedur des Click-Ereignisses der Schaltfläche abgeschlossen war, waren alle Instanzen von CDemo freigegeben.Warum wurden sie nicht abgeschlossen?Der Speicher-Manager schließt Objekte im Hintergrund ab. Dieser Vorgang besitzt geringePriorität.Die Priorität erhöht sich nur, wenn der verfügbare Speicher im System zu gering wird.Durch dieses träge Garbage Collection-Schema wird eine sehr zügige Objektzuordnung ermöglicht.
Klicken Sie noch einige weitere Male auf die Schaltfläche, und beobachten Sie dabei die Beschriftung.Irgendwann nimmt die Zahl der Instanzen plötzlich ab.Dies bedeutet, dass der Speicher-Manager den Speicher einiger Objekte wieder freigegeben hat.
Hinweis Wenn Sie mehr als zehnmal geklickt haben und die Zahl der CDemo-Instanzen noch immer nicht abnimmt, müssen Sie den Code möglicherweise dahingehend korrigieren, dass mehr Speicher verwendet wird.Schließen Sie das Formular, und kehren Sie zur Entwicklungsumgebung zurück. Erhöhen Sie die Anzahl der Iterationen in der For-Schleife auf 10000.Führen Sie dann das Projekt erneut aus.
Wiederholen Sie Schritt 3.Diesmal werden Sie mehr Prozesse durchführen können, bevor der Speicher-Manager weitere Objekte abgeschlossen hat.
Bei jeder Wiederholung von Schritt 3 können Sie mehr CDemo-Objekte zuordnen, bevor der Speicher-Manager einschreitet.Dies ist darauf zurückzuführen, dass immer größere Bereiche von Visual Studio ausgelagert werden und folglich mehr Speicherplatz für Instanzen von CDemo zur Verfügung steht.
Schließen Sie das Formular, und kehren Sie zur Entwicklungsumgebung zurück.