Junior
Čo sú delegáti v C# a na čo slúžia?
sobes.tech AI
Odpoveď od AI
Delegáty v C# sú typovo bezpečné ukazovatele na metódy. Inkapsulujú metódu, čo umožňuje jej odovzdanie ako parametra alebo použitie ako typu premennej.
Používajú sa na:
- Implementáciu vzoru pozorovateľa (Observer): Udalosti v C# sú založené na delegátoch. Vydavateľ upozorňuje odberateľov volaním delegáta.
- Backové volania (Callbacks): Odovzdanie metódy ako argumentu funkcie, ktorá ju neskôr zavolá.
- Generické programovanie: Delegáty
ActionaFuncumožňujú vytvárať všeobecné metódy pracujúce s rôznymi typmi signatúr. - Paralelné a asynchrónne programovanie: Metódy na vykonávanie v iných vláknach alebo asynchrónne sa často odovzdávajú cez delegáty.
- LİNQ: Operátory LINQ aktívne využívajú delegáty na definovanie podmienok filtrovania, transformácie atď.
Príklad deklarácie a použitia delegáta:
// Deklarácia delegáta so signatúrou void a jedným argumentom typu int
public delegate void MyDelegate(int x);
public class MyClass
{
public void PrintNumber(int num)
{
Console.WriteLine($"Číslo: {num}");
}
public static void Main(string[] args)
{
// Vytvorenie inštancie delegáta ukazujúceho na metódu PrintNumber
MyDelegate del = new MyDelegate(new MyClass().PrintNumber);
// Volanie metódy cez delegáta
del(10);
}
}
Príklad s Action (pre metódy void bez návratovej hodnoty):
using System;
public class OtherClass
{
public void ExecuteAction(Action action)
{
action(); // Vykonávame odovzdaný delegát
}
public static void Main(string[] args)
{
Action myAction = () => Console.WriteLine("Ahoj z Action!");
new OtherClass().ExecuteAction(myAction);
}
}
Príklad s Func (pre metódy s návratovou hodnotou):
using System;
public class ThirdClass
{
public int Calculate(Func<int, int, int> operation, int a, int b)
{
return operation(a, b); // Vykonávame odovzdanú operáciu a vraciame výsledok
}
public static void Main(string[] args)
{
Func<int, int, int> add = (x, y) => x + y;
int result = new ThirdClass().Calculate(add, 5, 3);
Console.WriteLine($"Výsledok sčítania: {result}");
}
}