Sobes.tech
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 typu TResult. Může přijímat od 0 do 16 parametrů různých typů.
  • Predicate<T>: Delegát, který přijímá jeden parametr typu T a 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ů.