Sobes.tech
Junior

Co jsou události v C#?

sobes.tech AI

Odpověď od AI

Události v C# jsou mechanismus založený na vzoru "pozorovatel" (Observer Pattern), který umožňuje objektu (vydavateli) upozorňovat jiné objekty (odběratele) na výskyt určité akce nebo změnu stavu.

Hlavní komponenty:

  • Vydavatel (Publisher): Třída, která deklaruje událost.
  • Událost (Event): Deklarace události pomocí klíčového slova event. Určuje podpis metody, kterou budou používat obslužné rutiny.
  • Delegát (Delegate): Typ, který definuje podpis metod, které se mohou přihlásit k události. Často se používá předdefinovaný delegát EventHandler nebo EventHandler<TEventArgs>.
  • Odběratel (Subscriber): Třída nebo objekt, který se přihlásí k události vydavatele a poskytne metodu (obslužný program události), která je volána při spuštění události.
  • Obslužný program události (Event Handler): Metoda odběratele odpovídající podpisu delegáta události.

Příklad deklarace a použití:

// Deklarace delegáta, pokud se nepoužívá předdefinovaný EventHandler
public delegate void MyEventHandler(object sender, EventArgs e);

// Třída vydavatele
public class Publisher
{
    // Deklarace události s delegátem
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Vyvolání události (pokud jsou přihlášení odběratelé)
        OnMyEvent(EventArgs.Empty);
    }

    // Metoda pro vyvolání události (chráněná před null)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Třída odběratele
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Přihlášení k události
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Odhlášení od události
        publisher.MyEvent -= HandleMyEvent;
    }

    // Obslužný program události
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Událost se spustila!");
    }
}

// Příklad použití
public class Program
{
    public static void Main(string[] args)
    {
        Publisher pub = new Publisher();
        Subscriber sub = new Subscriber();

        sub.Subscribe(pub); // Přihlášení

        pub.DoSomething(); // Vyvolání události

        sub.Unsubscribe(pub); // Odhlášení (volitelné)
    }
}

Události zajišťují slabé propojení (loose coupling) mezi objekty, což jim umožňuje vzájemně komunikovat bez přímé znalosti o implementaci druhého objektu.