event keyword (C++/CLI a C++/CX)

Klíčové event slovo deklaruje událost, což je oznámení registrovaným odběratelům (obslužným rutinám událostí), že došlo k něčemu zajímavému.

Všechny moduly runtime

C++/CX podporuje deklarování člena události nebo bloku události. Člen události je zkratka pro deklarování bloku události. Ve výchozím nastavení člen události deklaruje add, removea raise funkce, které jsou deklarovány explicitně v bloku událostí. Pokud chcete přizpůsobit funkce v členu události, deklarujte místo toho blok události a potom přepište požadované funkce.

Syntaxe

// 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

Modifikátor
Modifikátor, který lze použít pro deklaraci události nebo metodu objektu událostí. Možné hodnoty jsou static a virtual.

delegate
Delegát, jehož podpis obslužné rutiny události se musí shodovat.

event_name
Název události.

return_value
Návratová hodnota metody objektu událostí. Chcete-li ověřit, musí být voidnávratový typ .

parameters
(volitelné) Parametry pro metoduraise, které odpovídají podpisu parametru delegáta.

Poznámky

Událost je přidružení mezi delegátem a obslužnou rutinou události. Obslužná rutina události je členová funkce, která reaguje při aktivaci události. Umožňuje klientům z libovolné třídy registrovat metody odpovídající podpisu a návratový typ delegáta.

Existují dva druhy deklarací událostí:

datový člen události
Kompilátor automaticky vytvoří úložiště pro událost ve formě člena typu delegáta a vytvoří interní add, removea raise členské funkce. Datový člen události musí být deklarován uvnitř třídy. Návratový typ návratového typu delegáta musí odpovídat návratovém typu obslužné rutiny události.

blok událostí
Blok událostí umožňuje explicitně deklarovat a přizpůsobovat chování add, removea raise metody.

Můžete použít operator += a operator -= přidat a odebrat obslužnou rutinu události nebo explicitně volat add a remove metody.

event je kontextově citlivé klíčové slovo. Další informace najdete v tématu Klíčová slova citlivá na kontext.

prostředí Windows Runtime

Poznámky

Další informace najdete v tématu Události (C++/CX).

Pokud chcete přidat a později odebrat obslužnou rutinu události, uložte EventRegistrationToken strukturu vrácenou add operací. Pak v remove operaci použijte uloženou EventRegistrationToken strukturu k identifikaci obslužné rutiny události k odebrání.

Požadavky

Možnost kompilátoru: /ZW

CLR (Common Language Runtime)

Klíčové slovo události umožňuje deklarovat událost. Událost je způsob, jak třída poskytovat oznámení, když se něco zajímavého stane.

Syntaxe

// 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

Modifikátor
Modifikátor, který lze použít pro deklaraci události nebo metodu objektu událostí. Možné hodnoty jsou static a virtual.

delegate
Delegát, jehož podpis obslužné rutiny události se musí shodovat.

event_name
Název události.

return_value
Návratová hodnota metody objektu událostí. Chcete-li ověřit, musí být voidnávratový typ .

parameters
(volitelné) Parametry pro metoduraise, které odpovídají podpisu parametru delegáta.

Poznámky

Událost je přidružení mezi delegátem a obslužnou rutinou události. Obslužná rutina události je členová funkce, která reaguje při aktivaci události. Umožňuje klientům z libovolné třídy registrovat metody, které odpovídají podpisu a návratovému typu podkladového delegáta.

Delegát může mít jednu nebo více přidružených metod. Tyto metody se volaly, když váš kód indikuje, že došlo k události. Událost v jednom programu může být zpřístupněna jiným programům, které cílí na modul CLR .NET Framework.

Existují dva druhy deklarací událostí:

datové členy událostí
Kompilátor vytvoří úložiště pro události datového člena jako člena typu delegáta. Datový člen události musí být deklarován uvnitř třídy. Označuje se také jako triviální událost. Příklad najdete v ukázce kódu.

bloky událostí
Bloky událostí umožňují přizpůsobit chování add, removea raise metody implementací add, removea raise metod. Podpis add, removea raise metody musí odpovídat podpisu delegáta. Události bloku událostí nejsou datovými členy. Jakékoli použití jako datový člen vygeneruje chybu kompilátoru.

Návratový typ obslužné rutiny události musí odpovídat návratovém typu delegáta.

V rozhraní .NET Framework můžete s datovým členem zacházet jako s metodou samotnou (to znamená metodou Invoke odpovídajícího delegáta). Provedete to tak, že předdefinujte typ delegáta pro deklarování datového člena spravované události. Naproti tomu spravovaná metoda události implicitně definuje odpovídajícího spravovaného delegáta, pokud ještě není definován. Příklad najdete v ukázce kódu na konci tohoto článku.

Při deklarování spravované události můžete určit add a remove přístupové objekty, které budou volány při přidání nebo odebrání obslužných rutin událostí pomocí operátorů += a -=. , addremovea raise metody lze volat explicitně.

Při vytváření a používání událostí v jazyce Microsoft C++ je potřeba provést následující kroky:

  1. Vytvoření nebo identifikace delegáta Pokud definujete vlastní událost, musíte také zajistit, aby se s klíčovým slovem event používal delegát. Pokud je událost předdefinovaná, v rozhraní .NET Framework například uživatelé události potřebují znát pouze název delegáta.

  2. Vytvořte třídu, která obsahuje:

    • Událost vytvořená z delegáta.

    • (Volitelné) Metoda, která ověřuje, že instance delegáta deklarovaná pomocí klíčového event slova existuje. Jinak musí být tato logika umístěna v kódu, který aktivuje událost.

    • Metody, které volají událost. Tyto metody mohou být přepsány některých funkcí základní třídy.

    Tato třída definuje událost.

  3. Definujte jednu nebo více tříd, které propojují metody s událostí. Každá z těchto tříd přidruží jednu nebo více metod k události v základní třídě.

  4. Použijte událost:

    • Vytvořte objekt třídy, který obsahuje deklaraci události.

    • Vytvořte objekt třídy, který obsahuje definici události.

Další informace o událostech C++/CLI najdete v tématu Události v rozhraní.

Požadavky

Možnost kompilátoru: /clr

Příklady

Následující příklad kódu ukazuje deklarování dvojic delegátů, událostí a obslužných rutin událostí. Ukazuje, jak se přihlásit k odběru (přidat), vyvolat a potom odhlásit (odebrat) obslužné rutiny událostí.

// 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

Následující příklad kódu ukazuje logiku použitou raise ke generování metody triviální události. Pokud má událost jednoho nebo více odběratelů, volání raise metody implicitně nebo explicitně volá delegáta. Pokud návratový typ delegáta není void a pokud existuje nula odběratelů událostí, raise metoda vrátí výchozí hodnotu pro typ delegáta. Pokud nejsou k dispozici žádné odběratele událostí, volání raise metody okamžitě vrátí a není vyvolána žádná výjimka. Pokud návratový typ delegáta není void, vrátí se typ delegáta.

// 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

Viz také

Přípony komponent pro .NET a UPW