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.