Sobes.tech
Junior

Co jsou delegáti v C# a k čemu slouží?

sobes.tech AI

Odpověď od AI

Delegáti v jazyce C# jsou typově bezpečné ukazatele na metody. Zapouzdřují metodu, což umožňuje její předání jako parametru nebo použití jako typu proměnné.

Používají se pro:

  • Implementaci vzoru pozorovatele (Observer): Události v C# jsou založeny na delegátech. Vysílač upozorňuje odběratele voláním delegáta.
  • Callbacky: Předání metody jako argumentu funkci, která ji později zavolá.
  • Obecné programování: Delegáty Action a Func umožňují vytvářet obecné metody pracující s různými podpisy.
  • Paralelní a asynchronní programování: Metody pro provádění v jiných vláknech nebo asynchronně jsou často předávány přes delegáty.
  • LİNQ: Operátory LINQ aktivně využívají delegáty k definování podmínek filtrování, transformace atd.

Příklad deklarace a použití delegáta:

// Deklarace delegáta s podpisem void a jedním argumentem 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)
    {
        // Vytvoření instance delegáta ukazující na metodu PrintNumber
        MyDelegate del = new MyDelegate(new MyClass().PrintNumber);

        // Volání metody přes delegáta
        del(10);
    }
}

Příklad s Action (pro void metody bez návratové hodnoty):

using System;

public class OtherClass
{
    public void ExecuteAction(Action action)
    {
        action(); // Spuštění předaného delegáta
    }

    public static void Main(string[] args)
    {
        Action myAction = () => Console.WriteLine("Ahoj z Action!");
        new OtherClass().ExecuteAction(myAction);
    }
}

Příklad s Func (pro metody 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); // Spuštění předané operace a vrácení výsledku
    }

    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ýsledek sčítání: {result}");
    }
}