Sobes.tech
Junior

Czym jest delegat w C#?

sobes.tech AI

Odpowiedź od AI

Delegat to typ odwołania, zadeklarowany za pomocą słowa kluczowego delegate. Encapsuluje metodę o określonej sygnaturze (typ zwracany i typy parametrów). W istocie, delegat jest bezpiecznym wskaźnikiem na metodę.

Główne właściwości delegatów:

  • Enkapsulacja metod: Delegat przechowuje informacje o metodzie, do której się odwołuje.
  • Bezpieczeństwo typów: Delegat może odwoływać się tylko do metod, których sygnatura dokładnie odpowiada sygnaturze delegata.
  • Multicast: Delegaty mogą odwoływać się do wielu metod jednocześnie. Przy wywołaniu delegata, wywoływane są wszystkie powiązane metody w kolejności ich dodania.

Przykład deklaracji i użycia:

// Deklaracja delegata
public delegate int MyDelegate(int x, int y);

// Metoda odpowiadająca sygnaturze delegata
public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

// Użycie delegata
public class Program
{
    public static void Main(string[] args)
    {
        Calculator calc = new Calculator();

        // Tworzenie instancji delegata i powiązanie z metodą Add
        MyDelegate del = new MyDelegate(calc.Add);

        // Wywołanie metody przez delegata
        int result = del(5, 3);
        System.Console.WriteLine(result); // Wypisze: 8
    }
}

Wraz z pojawieniem się .NET Framework 3.5 i LINQ, szeroko rozpowszechniły się wbudowane delegaty generyczne:

  • Action<T1, ..., Tn>: Delegat, który nie zwraca wartości (void). Może przyjąć od 0 do 16 parametrów różnych typów.
  • Func<T1, ..., Tn, TResult>: Delegat zwracający wartość typu TResult. Może przyjąć od 0 do 16 parametrów różnych typów.
  • Predicate<T>: Delegat przyjmujący jeden parametr typu T i zwracający wartość bool. Używany do sprawdzania warunków.

Tabela porównawcza wbudowanych delegatów:

Delegat Wartość zwracana Parametry Przykład użycia
Action void 0..16 parametrów Wykonanie akcji bez zwracania wartości
Func<TResult> TResult 0 parametrów + zwracana wartość TResult Obliczenia bez danych wejściowych
Func<T, TResult> TResult 1 parametr typu T + zwracana wartość TResult Przekształcenie wartości
Predicate<T> bool 1 parametr typu T Sprawdzanie warunku

Delegaty są szeroko wykorzystywane w obsłudze zdarzeń, operacjach asynchronicznych, LINQ i do implementacji callbacków.