Junior
Co je to delegát v C#?
sobes.tech AI
Odpověď od AI
Delegát je odkazový typ deklarovaný pomocí klíčového slova delegate. Zahrnuje metodu s určitým podpisem (typ návratové hodnoty a typy parametrů). V podstatě je delegát typově bezpečný ukazatel na metodu.
Hlavní vlastnosti delegátů:
- Zapouzdření metod: Delegát uchovává informace o metodě, na kterou odkazuje.
- Typová bezpečnost: Delegát může odkazovat pouze na ty metody, jejichž podpis přesně odpovídá podpisu delegáta.
- Multicast: Delegáty mohou odkazovat na několik metod současně. Při volání delegáta jsou volány všechny s ním spojené metody v pořadí jejich přidání.
Příklad deklarace a použití:
// Deklarace delegáta
public delegate int MyDelegate(int x, int y);
// Metoda odpovídající podpisu delegáta
public class Calculator
{
public int Add(int a, int b)
{
return a + b;
}
}
// Použití delegáta
public class Program
{
public static void Main(string[] args)
{
Calculator calc = new Calculator();
// Vytvoření instance delegáta a spojení s metodou Add
MyDelegate del = new MyDelegate(calc.Add);
// Volání metody přes delegáta
int result = del(5, 3);
System.Console.WriteLine(result); // Výstup: 8
}
}
S příchodem .NET Framework 3.5 a LINQ se široce rozšířily vestavěné generické delegáty:
Action<T1, ..., Tn>: Delegát, který nevrací hodnotu (void). Může přijímat od 0 do 16 parametrů různých typů.Func<T1, ..., Tn, TResult>: Delegát, který vrací hodnotu typuTResult. Může přijímat od 0 do 16 parametrů různých typů.Predicate<T>: Delegát, který přijímá jeden parametr typuTa vrací boolean. Používá se pro kontrolu podmínky.
Tabulka srovnání vestavěných delegátů:
| Delegát | Návratová hodnota | Parametry | Příklad použití |
|---|---|---|---|
Action |
void |
0..16 parametrů | Provádění akce bez návratové hodnoty |
Func<TResult> |
TResult |
0 parametrů + návratová hodnota TResult |
Výpočet bez vstupních dat |
Func<T, TResult> |
TResult |
1 parametr typu T + návratová hodnota TResult |
Převod hodnoty |
Predicate<T> |
bool |
1 parametr typu T |
Kontrola podmínky |
Delegáty jsou široce používány při zpracování událostí, asynchronních operacích, LINQ a pro implementaci callbacků.