event (Komponentenerweiterungen für C++)
Das event-Schlüsselwort deklariert ein Ereignis, das eine Benachrichtigung für registrierte Abonnenten (Ereignishandler) über ein aufgetretenes Ereignis von Interesse ist.
Alle Laufzeiten
C++/CX unterstützt die Deklaration eines Ereignismembers oder eines Ereignisblocks.Ein Ereignismember ist eine Kurznotation für das Deklarieren eines Ereignisblocks.Standardmäßig deklariert ein Ereignismember add(), remove() und raise()-Funktionen, die explizit in einem Ereignisblock deklariert werden.Um die Funktionen in einem Ereignismember anzupassen, deklarieren Sie einen Ereignisblock und überschreiben dann die Funktionen, die Sie benötigen.
Syntax
// event data member
modifier event delegate^ event_name;
// event block
modifier event delegate^ event_name
{
modifier return_value add(delegate^ name);
modifier void remove(delegate^ name);
modifier void raise(parameters);
}
Parameter
Modifizierer
Ein Modifizierer, der entweder auf der Ereignisdeklaration oder auf einer Ereignisaccessormethode verwendet werden kann.Mögliche Werte sind static und virtual.Delegat
Der Ereignishandler muss der Signatur des Delegaten entsprechen.Ereignisname
Der Name des Ereignisses.Rückgabewert
Der Rückgabewert der Ereignisaccessormethode.Der Rückgabetyp muss void sein, um überprüfbar zu sein.Parameters
(optional) Parameter für die raise-Methode, die der Signatur des Delegat-Parameters entspricht.
Hinweise
Ein Ereignis ist eine Zuordnung zwischen einem Delegaten und einer Memberfunktion (Ereignishandler), die auf das Auslösen des Ereignisses reagiert und Clients von einer beliebigen Klasse die Registrierung für Methoden ermöglicht, die der Signatur und dem Rückgabetyp des zugrunde liegenden Delegaten entsprechen.
Es gibt zwei Arten von Ereignisdeklarationen:
Ereignisdatenmember
Der Compiler erstellt automatisch Speicher für das Ereignis in Form eines Members des Delegattyps und erstellt interne add(), remove() und raise()-Memberfunktionen.Ein Ereignisdatenmember muss in einer Klasse deklariert werden.Der Rückgabetyp des Rückgabetyps des Delegaten muss mit dem Rückgabetyp des Ereignishandlers übereinstimmen.Ereignisblock
Mit einem Ereignisblock können Sie das Verhalten der Methoden add(), remove() und raise() explizit deklarieren und anpassen.
Mit operators+= und operator-= können Sie einen Ereignishandler hinzufügen und entfernen bzw. die Methoden add() und remove() explizit aufrufen.
event ist ein kontextbezogenes Schlüsselwort. Weitere Informationen siehe Kontextbezogene Schlüsselwörter (Komponentenerweiterungen für C++).
Windows-Runtime
Hinweise
Weitere Informationen finden Sie unter Ereignisse (C++/CX).
Wenn Sie beabsichtigen, einen Ereignishandler hinzuzufügen und dann zu entfernen, müssen Sie die EventRegistrationToken-Struktur speichern, die vom Hinzufügevorgang zurückgegeben wird.Beim Entfernen müssen Sie dann die gespeicherte EventRegistrationToken-Struktur verwenden, um den zu entfernenden Ereignishandler zu identifizieren.
Anforderungen
Compileroption: /ZW
Common Language Runtime
Mit dem event-Schlüsselwort können Sie ein Ereignis deklarieren.Ein Ereignis ist eine Methode, mit der eine Klasse Benachrichtigungen bereitstellt, wenn ein Ereignis von Interesse geschieht.
Syntax
// event data member
modifier event delegate^ event_name;
// event block
modifier event delegate^ event_name
{
modifier return_value add(delegate^ name);
modifier void remove(delegate^ name);
modifier void raise(parameters);
}
Parameter
Modifizierer
Ein Modifizierer, der entweder auf der Ereignisdeklaration oder auf einer Ereignisaccessormethode verwendet werden kann.Mögliche Werte sind static und virtual.Delegat
Der Ereignishandler muss der Signatur des Delegaten entsprechen.Ereignisname
Der Name des Ereignisses.Rückgabewert
Der Rückgabewert der Ereignisaccessormethode.Der Rückgabetyp muss void sein, um überprüfbar zu sein.Parameters
(optional) Parameter für die raise-Methode, die der Signatur des Delegat-Parameters entspricht.
Hinweise
Ein Ereignis ist eine Zuordnung zwischen einem Delegaten und einer Memberfunktion (Ereignishandler), die auf das Auslösen des Ereignisses reagiert und Clients von einer beliebigen Klasse die Registrierung für Methoden ermöglicht, die der Signatur und dem Rückgabetyp des zugrunde liegenden Delegaten entsprechen.
Einem Delegaten können eine oder mehrere Methoden zugeordnet sein, die aufgerufen werden, wenn der Code angibt, dass das Ereignis aufgetreten ist.Ein Ereignis in einem Programm kann für andere Programme verfügbar gemacht werden, die auf der .NET Framework Common Language Runtime basieren.Ein Beispiel finden Sie unter Ein Ereignis auslösen, das in einer anderen Assembly definiert ist.
Es gibt zwei Arten von Ereignisdeklarationen:
Ereignisdatenmember
Speicher für das Ereignis in Form eines Members des Delegattyps. Er wird vom Compiler für Datenmemberereignisse erstellt.Ein Ereignisdatenmember muss in einer Klasse deklariert werden.Dies wird auch als triviales Ereignis (siehe Beispiel unten) bezeichnet.Ereignisblöcke
Mit Ereignisblöcken können Sie das Verhalten der Hinzufüge-, Entfernen- und Auslösen-Methoden anpassen, indem Sie die entsprechenden Methoden implementieren.Die Signatur der Methoden zum Hinzufügen, Entfernen und Auslösen muss mit der Signatur der Methode des Delegaten übereinstimmen.Ereignisblockereignisse sind nicht Datenmember, und jegliche Verwendung als Datenmember löst Compilerfehler aus.Ein Beispiel finden Sie unter Definieren von Ereignisaccessormethoden.
Der Rückgabetyp des Ereignishandlers muss dem Rückgabetyp des Delegaten entsprechen.
In .NET Framework können Sie einen Datenmember behandeln, als wäre er eine Methode selbst (d. h. die Invoke-Methode des entsprechenden Delegaten).Sie müssen den Delegattyp vordefinieren, um einen verwalteten Ereignisdatenmember zu deklarieren.Im Gegensatz dazu definiert eine verwaltete Ereignismethode implizit den entsprechenden verwalteten Delegaten, sofern er noch nicht definiert ist.Ein Codebeispiel finden Sie am Ende dieses Themas.
Wenn Sie implizit ein verwaltetes Ereignis deklarieren, können Sie add- und remove-Accessoren angeben, die aufgerufen werden, wenn Ereignishandler mit den Operatoren += und -= hinzugefügt oder entfernt werden.Das Methoden zum Hinzufügen, Entfernen und Auslösen können explizit aufgerufen werden.
Die folgenden Schritte müssen durchgeführt werden, um Ereignisse in Visual C++ zu erstellen und zu verwenden:
Erstellen oder bestimmen Sie einen Delegaten.Wenn Sie ein eigenes Ereignis definieren, müssen Sie außerdem sicherstellen, dass es einen mit dem event-Schlüsselwort zu verwendenden Delegaten gibt.Wenn das Ereignis z. B. .NET Framework vordefiniert ist, müssen die Konsumenten des Ereignisses nur den Namen des Delegaten kennen.
Erstellen Sie eine Klasse, die Folgendes enthält:
Ein vom Delegaten erstelltes Ereignis.
(optional) Eine Methode, die überprüft, ob eine Instanz des Delegaten, der mit dem event-Schlüsselwort deklariert wird, vorhanden ist.Andernfalls muss diese Logik in den Code eingefügt werden, der das Ereignis auslöst.
Methoden, die das Ereignis aufrufen.Diese Methoden können Überschreibungen von Basisklassenfunktionalitäten sein.
Diese Klasse definiert das Ereignis.
Definieren Sie eine oder mehrere Klassen, die Methoden mit dem Ereignis verknüpfen.Jede dieser Klassen ordnet dem Ereignis in der Basisklasse eine oder mehrere Methoden zu.
Verwenden Sie das Ereignis:
Erstellen Sie ein Objekt der Klasse, die die Ereignisdeklaration enthält.
Erstellen Sie ein Objekt der Klasse, die die Ereignisdefinition enthält.
Weitere Informationen zu C++/CLI-Ereignissen finden Sie unter
Überschreiben des Standardzugriffs der Methoden zum Hinzufügen, Entfernen und Auslösen
Auslösen eines Ereignisses, das in einer anderen Assembly definiert ist
Anforderungen
Compileroption: /clr
Beispiele
Beispiel
Im folgenden Codebeispiel wird das Deklarieren von Paaren von Delegaten, Ereignissen und Ereignishandlern, das Abonnieren (Hinzufügen) der Ereignishandler, das Aufrufen der Ereignishandler und die Aufhebung des Abonnements (Entfernen) für die Ereignishandler erläutert.
// mcppv2_events.cpp
// compile with: /clr
using namespace System;
// declare delegates
delegate void ClickEventHandler(int, double);
delegate void DblClickEventHandler(String^);
// class that defines events
ref class EventSource {
public:
event ClickEventHandler^ OnClick; // declare the event OnClick
event DblClickEventHandler^ OnDblClick; // declare OnDblClick
void FireEvents() {
// raises events
OnClick(7, 3.14159);
OnDblClick("Hello");
}
};
// class that defines methods that will called when event occurs
ref class EventReceiver {
public:
void OnMyClick(int i, double d) {
Console::WriteLine("OnClick: {0}, {1}", i, d);
}
void OnMyDblClick(String^ str) {
Console::WriteLine("OnDblClick: {0}", str);
}
};
int main() {
EventSource ^ MyEventSource = gcnew EventSource();
EventReceiver^ MyEventReceiver = gcnew EventReceiver();
// hook handler to event
MyEventSource->OnClick += gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
MyEventSource->OnDblClick += gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);
// invoke events
MyEventSource->FireEvents();
// unhook handler to event
MyEventSource->OnClick -= gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
MyEventSource->OnDblClick -= gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);
}
Ausgabe
Beispiel
Im folgenden Codebeispiel wird die Logik erläutert, die verwendet wird, um die raise-Methode eines trivialen Ereignisses zu generieren: Wenn das Ereignis über einen oder mehrere Abonnenten verfügt, wird durch den Aufruf der raise-Methode implizit oder explizit der Delegat aufgerufen.Wenn der Rückgabetyp des Delegaten nicht void ist und wenn es keine Ereignisabonnenten gibt, gibt die Methode raise den Standardwert für den Delegattyp zurück.Wenn keine Ereignisabonnenten vorhanden sind, erfolgt durch den Aufruf der raise-Methode eine einfache Rückgabe, und es wird keine Ausnahme ausgelöst.Wenn der Delegatrückgabetyp nicht void ist, wird der Delegattyp zurückgegeben.
// trivial_events.cpp
// compile with: /clr /c
using namespace System;
public delegate int Del();
public ref struct C {
int i;
event Del^ MyEvent;
void FireEvent() {
i = MyEvent();
}
};
ref struct EventReceiver {
int OnMyClick() { return 0; }
};
int main() {
C c;
c.i = 687;
c.FireEvent();
Console::WriteLine(c.i);
c.i = 688;
EventReceiver^ MyEventReceiver = gcnew EventReceiver();
c.MyEvent += gcnew Del(MyEventReceiver, &EventReceiver::OnMyClick);
Console::WriteLine(c.i);
}
Ausgabe