Freigeben über


Exemplarische Vorgehensweise: Erstellen einer Komponente mit Visual C#

Aktualisiert: November 2007

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 verwendeten Version können die angezeigten Dialogfelder und Menübefehle von den in der Hilfe beschriebenen abweichen. Klicken Sie im Menü Extras auf Einstellungen importieren und exportieren, um die Einstellungen zu ändern. Weitere Informationen finden Sie unter Visual Studio-Einstellungen.

Erstellen des Projekts

So erstellen Sie die CDemoLib-Klassenbibliothek und die CDemo-Komponente

  1. Wählen Sie im Menü Datei die Option Neu, und klicken Sie auf Projekt, um das Dialogfeld Neues Projekt zu öffnen. Klicken Sie in der Liste der Visual C#-Projekttypen auf 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.

  2. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf CDemoLib und dann im Kontextmenü auf Eigenschaften. Im Feld Standardnamespace 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.

  3. Klicken Sie im Menü Projekt auf Komponente hinzufügen.

  4. Wählen Sie im Dialogfeld Neues Element hinzufügen die Option Komponentenklasse aus, und geben Sie im Feld Name die Zeichenfolge CDemo.cs ein. Klicken Sie auf Hinzufügen, um die Komponente zu erstellen.

    Der Klassenbibliothek wird eine mit CDemo bezeichnete Komponente hinzugefügt.

  5. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf CDemo.cs, und wählen Sie im Kontextmenü Code anzeigen aus. Der Code-Editor wird geöffnet.

    Beachten Sie : Component direkt unter public partial 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.

  6. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Class1.cs, 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.

  7. Klicken Sie im Menü Datei auf Alle speichern, um das Projekt zu speichern.

Hinzufügen von Konstruktoren und Destruktoren

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 Konstruktor und Destruktor der CDemo-Klasse hinzu

  1. 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 int InstanceID;
    private static int NextInstanceID = 0;
    private static long ClassInstanceCount = 0;
    

    Da die Membervariablen InstanceCount und NextInstanceID als static 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 statische Member initialisiert. Dies kann beim erstmaligen Erstellen eines CDemo-Objekts erfolgen, oder wenn zum ersten Mal auf einen der statischen Member der Klasse zugegriffen wird.

  2. Suchen Sie public CDemo() und public CDemo(IContainer container), die Standardkonstruktoren für die CDemo-Klasse. In Visual C# haben alle Konstruktoren denselben Namen wie die Klasse. Die Komponente kann über mehrere Konstruktoren mit unterschiedlichen Parametern verfügen, alle Konstruktoren müssen jedoch denselben Namen wie die Komponente tragen.

    Hinweis:

    Die Zugriffsebene der Konstruktoren bestimmt, welche Clients Instanzen der Klasse erstellen können.

  3. Fügen Sie public CDemo() 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 ++;
    ClassInstanceCount ++;
    

    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 C# veranschaulicht.

  4. Fügen Sie die folgende Methode nach dem Ende des Konstruktors hinzu:

    ~CDemo()
    {
       ClassInstanceCount --;
    }
    

    Diese Methode wird als Destruktor bezeichnet und durch eine Tilde (~) vor dem Klassennamen gekennzeichnet. Der Speicher-Manager ruft den Destruktor auf, bevor er den durch das CDemo-Objekt belegten Speicher endgültig wieder in Anspruch nimmt. Indem Sie einen Destruktor implementieren, 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, nämlich eine statische 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 static long InstanceCount
       {
          get
          {
             return ClassInstanceCount;
          }
       }
    

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

  1. Zeigen Sie im Menü Datei auf Hinzufügen, und wählen Sie Neues Projekt, um das Dialogfeld Neues Projekt hinzufügen zu öffnen.

  2. Wählen Sie die Projektvorlage Windows-Anwendung aus, und geben Sie CDemoTest in das Feld Name ein. Klicken Sie anschließend auf OK.

  3. 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 Using-Anweisung hinzugefügt werden.

So fügen Sie dem Klassenbibliotheksprojekt einen Verweis hinzu

  1. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Knoten Verweise direkt unter CDemoTest, und wählen Sie im Kontextmenü Verweis hinzufügen aus.

  2. Wählen Sie im Dialogfeld Verweis hinzufügen die Registerkarte Projekte aus.

  3. Doppelklicken Sie auf das Klassenbibliotheksprojekt CDemoLib. CDemoLib wird unter dem Knoten Verweise für das CDemoTest-Projekt angezeigt.

  4. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf Form1.cs 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 Using-Anweisung hinzu

  • Fügen Sie der Liste der using-Anweisungen im oberen Bereich des Code-Editors für Form1 die folgende using-Anweisung hinzu.

    using CDemoLib;
    

    Wenn Sie die using-Anweisung hinzufügen, können Sie den Bibliotheksnamen auslassen und auf den Komponententyp als CDemo verweisen.

    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

  1. Klicken Sie auf Form1.cs [Entwurf], um zum Designer zurückzukehren.

  2. Ö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.

  3. 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.

    this.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 statischen InstanceCount-Eigenschaft verwendet. Um auf einen statischen Member zuzugreifen, muss keine Instanz von CDemo erstellt werden.

  4. Suchen Sie den Konstruktor für Form1 (public Form1()), und fügen Sie nach dem Aufruf von InitializeComponent() folgenden Code hinzu.

    timer1.Enabled = true;
    

    Dadurch wird der Zeitgeber gestartet, sobald das Formular erstellt ist.

  5. Klicken Sie auf die Registerkarte Form1.cs [Entwurf], um zum Designer zurückzukehren.

  6. 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.

    CDemo cd;
    int ct;
    for (ct = 0; ct < 1000; ct++)
       cd = new CDemo();
    

    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

  1. 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.

  2. 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.

  3. 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, und führen Sie das Projekt erneut aus.

  4. 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 werden Sie wahrscheinlich mehr CDemo-Objekte zuordnen können, 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.

  5. Schließen Sie das Formular, und kehren Sie zur Entwicklungsumgebung zurück.

Siehe auch

Weitere Ressourcen

Programmieren mit Komponenten

Exemplarische Vorgehensweise: Erstellen von Komponenten