Delegáty v jazyce C# představují datový typ, který slouží k uchování odkazu na metodu se specifickou signaturou (hlavičkou metody). Umožňují volat metody nepřímo, aniž by se přímo uváděl jejich název ve zdrojovém kódu. Jsou bezpečné vůči typům, protože lze přiřadit pouze metody se stejným návratovým typem a parametry, jaké definuje delegát.

Delegáty podporují vícenásobné přiřazení metod, čímž vzniká multicast delegát, který při vyvolání postupně spustí všechny přiřazené metody. Často se používají při implementaci událostí (events), callbacků nebo vzorů typu publish-subscribe.

V jazyce C# existují i vestavěné generické delegáty jako Action, Func nebo Predicate, které usnadňují práci s delegáty bez nutnosti vytvářet vlastní definice. Delegáty zvyšují flexibilitu kódu, ale mohou s sebou nést i mírnou režii oproti přímému volání metod.

Typy delegátů

Delegáty lze rozdělit do dvou kategorií:

  • Vlastní (programátorem definované) delegáty
  • Systémové (vestavěné) delegáty

Vlastní delegáty

Definuje se pomocí klíčového slova delegate:

public delegate void PrintMessage(string message);

Ukázka použití:

void ShowMessage(string message)
{
    Console.WriteLine(message);
}
 
PrintMessage printer = ShowMessage;
printer("Ahoj světe!");

Multicast delegát

Delegát může obsahovat více metod. Při vyvolání se spustí všechny.

PrintMessage printer = ShowMessage;
printer += LogMessage;
printer("Test"); // zavolá ShowMessage i LogMessage

Systémové delegáty

Action

  • Bez návratové hodnoty
  • Může mít 0 až 16 parametrů.
Action<string> print = s => Console.WriteLine(s);

Func

  • Vrací hodnotu (generic).
  • Poslední generický parametr = návratový typ.
Func<int, int, int> multiply = (a, b) => a * b;

Predicate

  • Vždy vrací bool.
  • Praktické pro filtry.
Predicate<int> isPositive = x => x > 0;