Události (events) představují mechanismus pro oznámení, že došlo k určité změně uvnitř objektu, aniž by objekt musel znát, kdo na tento jev reaguje. Jsou klíčovým stavebním prvkem vzoru publisher-subscriber (publish-subscribe pattern). Kvůli nutnosti silných referencí na delegáty jednotlivých objektů se ale v C# příliš nevyužívají.
Pomocí událostí mohou různé části aplikace:
- oznamovat změny stavu (např. změna hodnoty, příchod dat),
- umožnit jiným částem aplikace zareagovat na danou situaci,
- oddělit logiku vyvolání události od jejího zpracování.
Události jsou velmi časté například v:
- uživatelských rozhraních (kliknutí na tlačítko) - toto se používá velmi často ve WinForm,
- knihovnách pro signály, streamy nebo reakce na vstupy.
Události v C#
Eventy v C# se označují klíčovým slovem event. Interně využívají delegáty, které představují ukazatele na funkce.
Tvorba události
public class Publisher
{
// Definice delegáta
public delegate void MyEventHandler(string message);
// Definice události
public event MyEventHandler MyEvent;
public void RaiseEvent(string message)
{
// Kontrola, zda někdo na událost poslouchá
if (MyEvent != null)
{
MyEvent(message);
}
}
}Modernější způsob používá předdefinovaný delegát EventHandler nebo generický EventHandler<TEventArgs>:
public class Publisher
{
public event EventHandler MyEvent;
public void RaiseEvent()
{
MyEvent?.Invoke(this, EventArgs.Empty);
}
}Přihlášení k události
Přihlásit se k události je možné pomocí +=.
Publisher publisher = new Publisher();
publisher.MyEvent += HandlerMethod;
void HandlerMethod(string message)
{
Console.WriteLine("Zachyceno: " + message);
}Pokud událost používá EventHandler:
Publisher publisher = new Publisher();
publisher.MyEvent += (sender, args) => Console.WriteLine("Událost byla vyvolána.");Odhlášení se z události
Odhlášení je možné pomocí -=.
publisher.MyEvent -= HandlerMethod;Nutnost odhlašovat se z odběru
Pokud odběratel již nepotřebuje informace o událostech, tak se musí odhlásit. Jinak objekt odběratele není možné odstranit z paměti a vzniká Memory Leak.