====== Delegáty a události v C# ====== **Delegáty** a **události** tvoří základ pro programování řízené událostmi (event-driven programming). Zatímco delegát je "ukazatel na metodu", událost je mechanismus, který umožňuje objektu upozornit ostatní objekty, že se něco stalo. ===== 1. Delegáty (Delegates) ===== Delegát je referenční typ, který definuje **podpis metody** (návratový typ a parametry). Jakákoli metoda, která odpovídá tomuto podpisu, může být přiřazena k danému delegátovi. ==== Příklad definice delegáta: ==== // Definice podpisu: metoda musí přijímat string a vracet void public delegate void MujDelegat(string zprava); public void VypisDoKonzole(string text) => Console.WriteLine(text); // Použití MujDelegat del = VypisDoKonzole; del("Ahoj přes delegáta!"); --- ===== 2. Multicast delegáty ===== Delegáty mohou obsahovat odkazy na více metod najednou. Pomocí operátoru `+=` můžete přidat další metodu do "seznamu volání". Při zavolání delegáta se pak spustí všechny metody v pořadí, v jakém byly přidány. --- ===== 3. Události (Events) ===== Událost je zapouzdřený delegát. Používá se k implementaci vzoru **Publisher-Subscriber** (Vydavatel-Odběratel). * **Publisher** (Vydavatel) vyvolá událost. * **Subscriber** (Odběratel) se k události přihlásí a definuje, co se má stát, když událost nastane. ==== Příklad události: ==== public class Termostat { // Definice události public event Action TeplotaZmenena; public void NastavTeplotu(double novaTeplota) { // Vyvolání události (pokud má nějaké odběratele) TeplotaZmenena?.Invoke(novaTeplota); } } // Odběr události termostat.TeplotaZmenena += t => Console.WriteLine($"Teplota je: {t}"); --- ===== 4. Delegát vs. Událost ===== ^ Vlastnost ^ Delegát ^ Událost ^ | **Účel** | Předávání metod jako parametrů. | Signalizace stavu/akce jiným třídám. | | **Zapouzdření** | Může být vyvolán kýmkoliv, kdo k němu má přístup. | Může být vyvolána **pouze** třídou, která ji definuje. | | **Použití** | Callbacky, [[it:sw:linq|LINQ]]. | Uživatelské rozhraní, senzory, notifikace. | --- ===== 5. Standardní vzor v .NET (EventHandler) ===== Pro události se v .NET doporučuje používat standardní delegát `EventHandler` nebo `EventHandler`, který předává: 1. `object sender` – kdo událost vyvolal. 2. `TEventArgs e` – data o události. ---- //Související články:// * [[it:sw:lambda_expressions|Lambda výrazy v C#]] * [[it:sw:linq|LINQ: Dotazování v C#]] * [[it:sw:design_patterns|Návrhový vzor Observer]] //Tagy: {{tag>programming dot-net csharp delegates events publisher-subscriber}}//