Sobes.tech
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 Action a Func umožň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}");
    }
}