====== 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}}//