Sobes.tech
Junior

Czym są delegaty w C# i do czego służą?

sobes.tech AI

Odpowiedź od AI

Delegaty w C# to bezpieczne typowo wskaźniki na metody. Encapsulują metodę, umożliwiając jej przekazanie jako parametr lub użycie jako typu zmiennej.

Są używane do:

  • Implementacji wzorca obserwatora (Observer): Wydarzenia w C# opierają się na delegatach. Nadawca powiadamia subskrybentów wywołując delegata.
  • Wywołania zwrotne (Callbacks): Przekazywanie metody jako argumentu do funkcji, która wywoła ją później.
  • Programowania generycznego: Delegaty Action i Func pozwalają tworzyć metody ogólne, działające z różnymi sygnaturami.
  • Programowania równoległego i asynchronicznego: Metody do wykonywania w innych wątkach lub asynchronicznie często są przekazywane przez delegaty.
  • LINQ: Operatory LINQ aktywnie korzystają z delegatów do określania warunków filtrowania, transformacji itp.

Przykład deklaracji i użycia delegata:

// Deklaracja delegata z sygnaturą void i jednym argumentem typu int
public delegate void MyDelegate(int x);

public class MyClass
{
    public void PrintNumber(int num)
    {
        Console.WriteLine($"Liczba: {num}");
    }

    public static void Main(string[] args)
    {
        // Tworzenie instancji delegata wskazującego na metodę PrintNumber
        MyDelegate del = new MyDelegate(new MyClass().PrintNumber);

        // Wywołanie metody przez delegata
        del(10);
    }
}

Przykład z Action (dla metod void bez wartości zwrotnej):

using System;

public class OtherClass
{
    public void ExecuteAction(Action action)
    {
        action(); // Wykonanie przekazanego delegata
    }

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

Przykład z Func (dla metod z wartością zwrotną):

using System;

public class ThirdClass
{
    public int Calculate(Func<int, int, int> operation, int a, int b)
    {
        return operation(a, b); // Wykonanie przekazanej operacji i zwrócenie wyniku
    }

    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($"Wynik dodawania: {result}");
    }
}