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
ActioniFuncpozwalają 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}");
}
}