Vorgehensweise: Abonnieren von Ereignissen und Kündigen von Ereignisabonnements (C#-Programmierleitfaden)
Wenn Sie benutzerdefinierten Code schreiben möchten, der aufgerufen wird, wenn dieses Ereignis ausgelöst wird, können Sie ein Ereignis abonnieren, das von einer anderen Klasse veröffentlicht wurde. Sie können z.B. das click
-Ereignis einer Schaltfläche abonnieren, damit Ihre Anwendung etwas nützliches macht, wenn ein Benutzer auf die Schaltfläche klickt.
So abonnieren Sie Ereignisse mit der Visual Studio IDE
Wenn Sie in der Ansicht Entwurf das Fenster Eigenschaften nicht sehen können, klicken Sie mit der rechten Maustaste auf das Formular oder das Kontrollelement, für das Sie einen Ereignishandler erstellen möchten, und wählen Sie anschließen Eigenschaften aus.
Klicken Sie oben im Fenster Eigenschaften auf das Symbol Ereignisse.
Doppelklicken Sie auf das Ereignis, das Sie erstellen möchten, z.B. das
Load
-Ereignis.Visual C# erstellt eine leere Ereignishandlermethode, und fügt diese in den Code ein. Alternativ können Sie den Code auch manuell in der Codeansicht einfügen. Die folgenden Codezeilen deklarieren beispielsweise eine Eventhandlermethode, die aufgerufen wird, wenn die Klasse
Form
dasLoad
-Ereignis auslöst.private void Form1_Load(object sender, System.EventArgs e) { // Add your form load event handling code here. }
Die Codezeile, die für das Abonnement des Ereignisses erforderlich ist, wird auch automatisch in der
InitializeComponent
-Methode in der Datei „Form1.Designer.cs“ in Ihrem Projekt generiert. Sie sieht ungefähr so aus:this.Load += new System.EventHandler(this.Form1_Load);
So abonnieren Sie Ereignisse programmgesteuert
Definieren Sie eine Ereignishandlermethode, deren Signatur mit der Delegatsignatur des Ereignisses übereinstimmt. Wenn das Ereignis z.B. auf dem Delegattyp EventHandler basiert, repräsentiert der folgende Code den Methodenstub:
void HandleCustomEvent(object sender, CustomEventArgs a) { // Do something useful here. }
Verwenden Sie den Additionszuweisungsoperator (
+=
), um Ihrem Ereignis einen Ereignishandler anzufügen. Gehen Sie in folgendem Beispiel davon aus, dass ein Objekt mit dem Namenpublisher
ein Ereignis mit dem NamenRaiseCustomEvent
aufweist. Beachten Sie, dass die Abonnementklasse einen Verweis auf die Herausgeberklasse benötigt, um deren Ereignis abonnieren zu können.publisher.RaiseCustomEvent += HandleCustomEvent;
Sie können auch einen Lambdaausdruck zum Angeben eines Ereignishandlers verwenden:
public Form1() { InitializeComponent(); this.Click += (s,e) => { MessageBox.Show(((MouseEventArgs)e).Location.ToString()); }; }
So abonnieren Sie Ereignisse mit einer anonymen Funktion
Wenn Sie das Abonnement eines Ereignisses später nicht kündigen müssen, können Sie den Additionszuweisungsoperator (+=
) verwenden, um eine anonyme Funktion als Ereignishandler anzufügen. Gehen Sie in folgendem Beispiel davon aus, dass ein Objekt mit dem Namen publisher
ein Ereignis mit dem Namen RaiseCustomEvent
aufweist, und dass eine CustomEventArgs
-Klasse so definiert wurde, dass Sie eine Art von spezialisierter Ereignisinformation enthält. Beachten Sie, dass die Abonnementklasse einen Verweis auf die publisher
benötigt, um deren Ereignis abonnieren zu können.
publisher.RaiseCustomEvent += (object o, CustomEventArgs e) =>
{
string s = o.ToString() + " " + e.ToString();
Console.WriteLine(s);
};
Sie können das Abonnement eines Ereignisses nicht ohne Weiteres kündigen, wenn Sie eine anonyme Funktion zum Abonnieren verwendet haben. Um in einem derartigen Szenario das Abonnement kündigen zu können, kehren Sie zu dem Code zurück, mit dem Sie das Ereignis abonniert haben, speichern Sie anschließend die anonyme Funktion in einer Delegatvariablen, und fügen Sie den Delegaten dann dem Ereignis hinzu. Es wird empfohlen, keine anonymen Funktionen für das Abonnieren von Ereignissen zu verwenden, wenn Sie das Abonnement später in Ihrem Code noch einmal kündigen müssen. Weitere Informationen zu anonymen Funktionen finden Sie unter Lambdaausdrücke.
Kündigen des Abonnements
Kündigen Sie das Ereignisabonnement, um ein Abrufen des Ereignishandlers beim Auslösen des Ereignisses zu verhindern. Sie sollten das Ereignisabonnement kündigen, bevor Sie ein Abonnentenobjekt verwerfen, um Ressourcenverluste zu verhindern. Bis zur Kündigung Ihres Ereignisabonnements verweist der Multicastdelegat, der dem Ereignis im Veröffentlichungsobjekt zugrunde liegt, auf einen Delegaten, der den Ereignishandler des Abonnenten einkapselt. Solange das Veröffentlichungsobjekt diesen Verweis enthält, wird Ihr Abonnentenobjekt bei der automatische Speicherbereinigung nicht gelöscht.
So kündigen Sie ein Ereignisabonnement
Verwenden Sie den Subtraktionszuweisungsoperator (
-=
), um ein Ereignisabonnement zu kündigen:publisher.RaiseCustomEvent -= HandleCustomEvent;
Wenn alle Abonnenten ihr Ereignisabonnement gekündigt haben, wird die Ereignisinstanz in der Herausgeberklasse auf
null
festgelegt.