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
, remove
a 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 void
ná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
, remove
a 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
, remove
a 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 void
ná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
, remove
a raise
metody implementací add
, remove
a raise
metod. Podpis add
, remove
a 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 -=
. , add
remove
a 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:
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.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.
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ě.
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