event słowo kluczowe (C++/CLI i C++/CX)

Słowo event kluczowe deklaruje zdarzenie, które jest powiadomieniem dla zarejestrowanych subskrybentów (procedur obsługi zdarzeń), że wystąpiło coś interesującego.

Wszystkie środowiska wykonawcze

Język C++/CX obsługuje deklarowanie elementu członkowskiego zdarzenia lub bloku zdarzeń. Element członkowski zdarzenia jest skrócony do deklarowania bloku zdarzeń. Domyślnie element członkowski zdarzenia deklaruje addfunkcje , removei raise , które są zadeklarowane jawnie w bloku zdarzeń. Aby dostosować funkcje w elemencie członkowskim zdarzenia, zadeklaruj blok zdarzeń, a następnie przesłoń wymagane funkcje.

Składnia

// 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);
}

Parametry

Modyfikator
Modyfikator, który może być używany w deklaracji zdarzenia lub metodzie dostępu zdarzenia. Możliwe wartości to static i virtual.

delegate
Delegat, którego podpis programu obsługi zdarzeń musi być zgodny.

event_name
Nazwa zdarzenia.

return_value
Wartość zwracana metody dostępu zdarzeń. Aby można je było zweryfikować, zwracany typ musi mieć wartość void.

parameters
(opcjonalnie) raise Parametry metody, która jest zgodna z podpisem parametru delegata.

Uwagi

Zdarzenie jest skojarzeniem między pełnomocnikiem a procedurą obsługi zdarzeń. Procedura obsługi zdarzeń jest funkcją składową, która odpowiada po wyzwoleniu zdarzenia. Umożliwia klientom z dowolnej klasy rejestrowanie metod pasujących do podpisu i zwracanego typu delegata.

Istnieją dwa rodzaje deklaracji zdarzeń:

składowa danych zdarzenia
Kompilator automatycznie tworzy magazyn dla zdarzenia w postaci elementu członkowskiego typu delegata i tworzy wewnętrzne addfunkcje , removei raise składowe. Element członkowski danych zdarzenia musi być zadeklarowany wewnątrz klasy. Zwracany typ zwracanego typu delegata musi być zgodny z typem zwrotnym programu obsługi zdarzeń.

blok zdarzeń
Blok zdarzeń umożliwia jawne deklarowanie i dostosowywanie zachowania addmetod , removei raise .

Możesz użyć metody operator += i operator -= , aby dodać i usunąć program obsługi zdarzeń lub jawnie wywołać add metody i remove .

event jest kontekstowym słowem kluczowym. Aby uzyskać więcej informacji, zobacz Kontekstowe słowa kluczowe.

Środowisko wykonawcze systemu Windows

Uwagi

Aby uzyskać więcej informacji, zobacz Zdarzenia (C++/CX).

Aby dodać program obsługi zdarzeń i później go usunąć, zapisz EventRegistrationToken strukturę zwróconą przez operację add . Następnie w remove operacji użyj zapisanej EventRegistrationToken struktury, aby zidentyfikować program obsługi zdarzeń do usunięcia.

Wymagania

Opcja kompilatora: /ZW

środowiska uruchomieniowe w trakcie wykonania

Słowo kluczowe zdarzenia umożliwia zadeklarowanie zdarzenia. Zdarzenie to sposób, aby klasa dostarczała powiadomienia, gdy coś interesującego się stanie.

Składnia

// 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);
}

Parametry

Modyfikator
Modyfikator, który może być używany w deklaracji zdarzenia lub metodzie dostępu zdarzenia. Możliwe wartości to static i virtual.

delegate
Delegat, którego podpis programu obsługi zdarzeń musi być zgodny.

event_name
Nazwa zdarzenia.

return_value
Wartość zwracana metody dostępu zdarzeń. Aby można je było zweryfikować, zwracany typ musi mieć wartość void.

parameters
(opcjonalnie) raise Parametry metody, która jest zgodna z podpisem parametru delegata.

Uwagi

Zdarzenie jest skojarzeniem między pełnomocnikiem a procedurą obsługi zdarzeń. Procedura obsługi zdarzeń jest funkcją składową, która odpowiada po wyzwoleniu zdarzenia. Umożliwia klientom z dowolnej klasy rejestrowanie metod pasujących do podpisu i zwracanego typu bazowego delegata.

Delegat może mieć jedną lub więcej skojarzonych metod. Metody te są wywoływane, gdy kod wskazuje, że zdarzenie miało miejsce. Zdarzenie w jednym programie można udostępnić innym programom przeznaczonym dla środowiska uruchomieniowego języka wspólnego programu .NET Framework.

Istnieją dwa rodzaje deklaracji zdarzeń:

składowe danych zdarzenia
Kompilator tworzy magazyn zdarzeń składowych danych jako element członkowski typu delegata. Element członkowski danych zdarzenia musi być zadeklarowany wewnątrz klasy. Jest on również znany jako trywialne wydarzenie. Zobacz przykładowy kod.

bloki zdarzeń
Bloki zdarzeń umożliwiają dostosowanie zachowania addmetod , removei raise przez zaimplementowanie addmetod , removei raise . Podpis addmetod , removei raise musi być zgodny z podpisem delegata. Zdarzenia bloku zdarzeń nie są elementami członkowskimi danych. Każde użycie jako element członkowski danych generuje błąd kompilatora.

Zwracany typ programu obsługi zdarzeń musi być zgodny z typem zwrotnym delegata.

W programie .NET Framework można traktować element członkowski danych tak, jakby był to sama metoda (czyli Invoke metoda odpowiadającego mu delegata). W tym celu należy wstępnie zdefiniować typ delegata do deklarowania elementu członkowskiego danych zdarzeń zarządzanych. Z kolei metoda zdarzenia zarządzanego niejawnie definiuje odpowiedni delegat zarządzany, jeśli nie jest jeszcze zdefiniowany. Zobacz przykładowy kod na końcu tego artykułu.

Podczas deklarowania zdarzenia zarządzanego można określić add metody i remove metody dostępu, które będą wywoływane, gdy programy obsługi zdarzeń zostaną dodane lub usunięte przy użyciu operatorów += i -=. addMetody , removei raise mogą być wywoływane jawnie.

Aby utworzyć zdarzenia i używać ich w języku Microsoft C++, należy wykonać następujące czynności:

  1. Utwórz lub zidentyfikuj pełnomocnika. Jeśli definiujesz własne zdarzenie, musisz również upewnić się, że istnieje delegat do użycia ze event słowem kluczowym. Jeśli zdarzenie jest wstępnie zdefiniowane, na przykład w programie .NET Framework odbiorcy zdarzenia potrzebują tylko znajomości nazwy delegata.

  2. Utwórz klasę zawierającą:

    • Zdarzenie utworzone na podstawie delegata.

    • (Opcjonalnie) Metoda sprawdzająca, czy wystąpienie delegata zadeklarowane za pomocą słowa kluczowego event istnieje. W przeciwnym razie ta logika musi zostać umieszczona w kodzie, który uruchamia zdarzenie.

    • Metody wywołujące zdarzenie. Te metody mogą być zastępowane przez niektóre funkcje klasy bazowej.

    Ta klasa definiuje zdarzenie.

  3. Zdefiniuj co najmniej jedną klasę łączącą metody ze zdarzeniem. Każda z tych klas skojarzy co najmniej jedną metodę ze zdarzeniem w klasie bazowej.

  4. Użyj zdarzenia:

    • Utwórz obiekt klasy zawierającej deklarację zdarzenia.

    • Utwórz obiekt klasy zawierającej definicję zdarzenia.

Aby uzyskać więcej informacji na temat zdarzeń języka C++/CLI, zobacz Zdarzenia w interfejsie.

Wymagania

Opcja kompilatora: /clr

Przykłady

W poniższym przykładzie kodu pokazano deklarowanie par delegatów, zdarzeń i procedur obsługi zdarzeń. Pokazuje on, jak subskrybować (dodać), wywoływać, a następnie anulować subskrypcję (usunąć) procedur obsługi zdarzeń.

// 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);
}
OnClick: 7, 3.14159

OnDblClick: Hello

W poniższym przykładzie kodu pokazano logikę używaną do generowania raise metody zdarzenia trywialnego. Jeśli zdarzenie ma co najmniej jednego subskrybenta, wywołanie raise metody niejawnie lub jawnie wywołuje delegata. Jeśli typ zwracany delegata nie void jest i jeśli istnieją zero subskrybentów zdarzeń, raise metoda zwraca wartość domyślną dla typu delegata. Jeśli nie ma subskrybentów zdarzeń, wywołanie metody natychmiast zwróci metodę raise i nie zostanie zgłoszony wyjątek. Jeśli typem zwracanym delegata nie voidjest , zwracany jest typ delegata.

// 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);
}
0

688

Zobacz też

Rozszerzenia składników dla platformy .NET i platformy uniwersalnej systemu Windows