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
EventHandlerneboEventHandler<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.