Delegát je datový typ, který představuje odkazy na metody s konkrétním seznamem parametrů a návratovým typem. Pokud vytvoříte instanci delegátu, můžete příslušnou instanci přidružit s jakoukoli metodou s kompatibilním podpisem a návratovým typem. Metodu můžete vyvolat (nebo volat) prostřednictvím instance delegátu.
Delegáty se používají pro předávání metod jako argumentů jiným metodám.
Delegáty se deklarují pomocí slova delegate, např:
delegate void MultiplyCallback(int i, double j);Vytvoření instance delegátu Přímé přiřazení (kratší způsob):
MultiplyCallback d = MultiplyNumbers;Přiřazení pomocí anonymní metody:
MultiplyCallback d = delegate(int x, double y) {
Console.WriteLine(x * y);
};Přiřazení pomocí lambda výrazu:
MultiplyCallback d = (x, y) => Console.WriteLine(x * y);d(5, 2.0); // Vyvolá delegáta, který následně zavolá metodu MultiplyNumbersPojmenované vs. Anonymní metody Pojmenované metody Pojmenované metody jsou samostatné bloky kódu, které vykonávají určitou činnost a mají přiřazený název. Tímto názvem je můžeme volat kdekoli v našem programu.
Mohou přijímat vstupní parametry (např. čísla, řetězce) a mohou vracet hodnoty. Mohou mít také výstupní parametry nebo nemusí vracet nic (typicky označováno jako void).
Příklad
delegate void MultiplyCallback(int i, double j);
void MultiplyNumbers(int m, double n) {
Console.WriteLine(m * n);
}
# Přiřazení a volání delegátu
MultiplyCallback d = MultiplyNumbers;
d(5, 2.0); Výstupem budou násobky čísel od 1 do 5 a čísla 2.
Delegáty v C# umožňují kombinaci více metod do jednoho delegáta, což se nazývá vícesměrové vysílání (multicast delegates). To znamená, že jeden delegát může odkazovat na více než jednu metodu. Můžete použít operátor + k přidání metod a operátor - k odstranění metod z kombinovaného delegáta.
Definice Delegáta:
delegate void CustomCallback(string s);Tento řádek definuje delegát, který může odkazovat na metody s jedním parametrem typu string a bez návratové hodnoty.
void Hello(string name) {
Console.WriteLine($"Hello, {name}!");
}
void Goodbye(string name) {
Console.WriteLine($"Goodbye, {name}!");
}Tyto metody mají stejný podpis jako delegát CustomCallback a vykonávají jednoduché výpisy na konzoli.
CustomCallback hiDel, byeDel, multiDel, multiMinusHiDel;hiDel = Hello;
byeDel = Goodbye;multiDel = hiDel + byeDel;Při kombinaci hiDel a byeDel vznikne nový delegát multiDel, který při vyvolání zavolá obě metody v pořadí, v jakém byly přidány.
multiMinusHiDel = multiDel - hiDel;Tento příkaz odebere hiDel z multiDel, takže multiMinusHiDel nyní volá pouze metodu Goodbye.
hiDel("A");
byeDel("B");
multiDel("C");
multiMinusHiDel("D");Invoking delegate hiDel:
Hello, A!
Invoking delegate byeDel:
Goodbye, B!
Invoking delegate multiDel:
Hello, C!
Goodbye, C!
Invoking delegate multiMinusHiDel:
Goodbye, D!