Sobes.tech
Junior

Čo sú udalosti v C#?

sobes.tech AI

Odpoveď od AI

Udalosti v jazyku C# sú mechanizmus založený na vzorec "pozorovateľ" (Observer Pattern), ktorý umožňuje objektu (vydavateľovi) informovať iné objekty (odberateľov) o nastaní určitej akcie alebo zmene stavu.

Hlavné komponenty:

  • Vydavateľ (Publisher): Trieda, ktorá oznamuje udalosť.
  • Udalosť (Event): Oznámenie udalosti pomocou kľúčového slova event. Určuje signatúru metódy, ktorú budú používať spracovatelia.
  • Delegát (Delegate): Typ, ktorý určuje signatúru metód, ktoré môžu byť prihlásené na udalosť. Často sa používa preddefinovaný delegát EventHandler alebo EventHandler<TEventArgs>.
  • Odberateľ (Subscriber): Trieda alebo objekt, ktorý sa prihlási na udalosť vydavateľa a poskytuje metódu (spracovateľ udalosti), ktorá sa volá pri jej aktivácii.
  • Spracovateľ udalosti (Event Handler): Metóda odberateľa, ktorá zodpovedá signatúre delegáta udalosti.

Príklad deklarácie a použitia:

// Deklarácia delegáta, ak sa nepoužíva preddefinovaný EventHandler
public delegate void MyEventHandler(object sender, EventArgs e);

// Trieda vydavateľa
public class Publisher
{
    // Oznámenie udalosti pomocou delegáta
    public event MyEventHandler MyEvent;

    public void DoSomething()
    {
        // Vyvolanie udalosti (ak sú odberatelia)
        OnMyEvent(EventArgs.Empty);
    }

    // Metóda na vyvolanie udalosti (chránená pred null)
    protected virtual void OnMyEvent(EventArgs e)
    {
        MyEvent?.Invoke(this, e);
    }
}

// Trieda odberateľa
public class Subscriber
{
    public void Subscribe(Publisher publisher)
    {
        // Prihlásenie na udalosť
        publisher.MyEvent += HandleMyEvent;
    }

    public void Unsubscribe(Publisher publisher)
    {
        // Odhlásenie od udalosti
        publisher.MyEvent -= HandleMyEvent;
    }

    // Spracovateľ udalosti
    private void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("Udalosť sa aktivovala!");
    }
}

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

        sub.Subscribe(pub); // Prihlásenie

        pub.DoSomething(); // Vyvolanie udalosti

        sub.Unsubscribe(pub); // Odhlásenie (voliteľné)
    }
}

Udalosti zabezpečujú slabé prepojenie (loose coupling) medzi objektmi, čo im umožňuje spolupracovať bez priamej znalosti o implementácii druhého.