Lekce 15: Delegáti a události – Asynchronní a dynamická správa akcí v C#
Delegáti a události jsou klíčovými prvky jazyka C#, které umožňují vytvářet flexibilní, dynamické a modulární aplikace. Tyto koncepty jsou úzce spjaty s návrhovými vzory a umožňují efektivní správu asynchronních operací a dynamické přidávání funkcionality. V této lekci se naučíte, co jsou delegáti a události, jak fungují a jak je využít pro vytváření robustních aplikací.
1. Co je delegát?
Delegát je typ, který uchovává odkaz na metodu nebo seznam metod, které lze vyvolat. Je to podobné jako ukazatel na funkci v jiných jazycích, ale delegát je bezpečný pro typy a podporuje více metod.
Deklarace delegáta
public delegate void MojeAkce(string zprava);
Delegát je deklarován pomocí klíčového slova delegate
. Syntaxe zahrnuje návratový typ a podpis metod, které může delegát uchovávat.
Tento delegát může uchovávat metody, které přijímají jeden parametr typu string a vracejí void.
Použití delegáta
Příklad:
using System;
class Program
{
// Definice delegáta
public delegate void MojeAkce(string zprava);
// Metoda odpovídající delegátu
public static void VytiskniZpravu(string zprava)
{
Console.WriteLine($"Zpráva: {zprava}");
}
static void Main()
{
// Vytvoření instance delegáta
MojeAkce akce = VytiskniZpravu;
// Volání delegáta
akce("Ahoj, světe!");
}
}
Výstup:
Zpráva: Ahoj, světe!
V tomto příkladu delegát MojeAkce
odkazuje na metodu VytiskniZpravu
, která se následně vyvolá.
2. Multicast delegáti
Delegáti v C# mohou uchovávat více metod. K tomu slouží multicast delegáti, které umožňují přidávat metody pomocí operátoru +=
.
Příklad:
public static void DruhaZprava(string zprava)
{
Console.WriteLine($"Další zpráva: {zprava.ToUpper()}");
}
static void Main()
{
MojeAkce akce = VytiskniZpravu;
akce += DruhaZprava;
// Delegát vyvolá obě metody
akce("Ahoj, světe!");
}
Výstup:
Zpráva: Ahoj, světe!
Další zpráva: AHOJ, SVĚTE!
3. Události v C#
Události jsou mechanismus, který umožňuje objektům komunikovat, aniž by si byly přímo vědomy své existence. Události jsou založeny na delegátech a umožňují dynamickou správu akcí, například v reakci na uživatelské interakce.
Deklarace události
Události se deklarují pomocí klíčového slova event
.
Příklad:
using System;
class Program
{
// Definice delegáta
public delegate void ZmenaHodnotyHandler(string zprava);
// Deklarace události
public static event ZmenaHodnotyHandler ZmenaHodnoty;
static void Main()
{
// Přiřazení metody k události
ZmenaHodnoty += VytiskniZpravu;
// Vyvolání události
ZmenaHodnoty?.Invoke("Hodnota byla změněna!");
}
}
Výstup:
Zpráva: Hodnota byla změněna!
V tomto příkladu je událost ZmenaHodnoty
vyvolána metodou Invoke
, což způsobí zavolání přidružené metody.
4. Použití delegátů a událostí v praxi
Asynchronní zpracování pomocí delegátů
Delegáti mohou být použiti k definování úloh, které budou spuštěny asynchronně.
Příklad:
using System;
using System.Threading;
public class Program
{
public delegate void AsynchronniAkce();
public static void DlouhaOperace()
{
Console.WriteLine("Začínám dlouhou operaci...");
Thread.Sleep(3000); // Simulace dlouhé operace
Console.WriteLine("Dlouhá operace dokončena.");
}
static void Main()
{
AsynchronniAkce akce = DlouhaOperace;
// Spuštění asynchronní úlohy
akce.BeginInvoke(null, null);
Console.WriteLine("Pokračuji v hlavním vláknu...");
}
}
Výstup:
Pokračuji v hlavním vláknu...
Začínám dlouhou operaci...
Dlouhá operace dokončena.
5. Události v uživatelském rozhraní
Události jsou klíčové při práci s uživatelským rozhraním (např. tlačítka, vstupní pole). Příklad níže ukazuje použití události při stisknutí tlačítka v konzolové aplikaci:
using System;
class Program
{
public delegate void KlikHandler(string zprava);
public static event KlikHandler NaKliknuti;
static void Main()
{
// Přiřazení metody k události
NaKliknuti += VytiskniZpravu;
Console.WriteLine("Stiskněte Enter pro vyvolání události.");
Console.ReadLine();
// Vyvolání události
NaKliknuti?.Invoke("Tlačítko bylo stisknuto.");
}
}
Výstup:
Stiskněte Enter pro vyvolání události.
Zpráva: Tlačítko bylo stisknuto.
6. Výhody delegátů a událostí
- Modularita: Kód lze snadno rozdělit na menší části, které spolu komunikují pomocí událostí.
- Dynamické akce: Umožňují přidávání a odebírání metod za běhu programu.
- Snadná správa: Zvyšují čitelnost a udržovatelnost kódu.
Závěr
Delegáti a události jsou nepostradatelné nástroje pro vývoj moderních aplikací v C#. Delegáti umožňují dynamické volání metod, zatímco události usnadňují komunikaci mezi objekty. Pochopení těchto konceptů vám umožní vytvářet robustní a efektivní aplikace, které snadno reagují na změny a uživatelské interakce.