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ść typuTResult. Może przyjąć od 0 do 16 parametrów różnych typów.Predicate<T>: Delegat przyjmujący jeden parametr typuTi 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.