Самые часто задаваемые вопросы на собеседовании по C#
20. Какие типы делегатов существуют в C#?
Делегаты в C# можно разделить на три основных типа:
1) Обычные
Ссылаются на один метод с соответствующей сигнатурой. Когда делегат вызывается, он вызывает указанный метод.
public delegate void DisplayMessage(string message);2) Многоадресные (Multicast)
DisplayMessage display = ShowMessage;
display("Hello, delegate!");
void ShowMessage(string message)
=> Console.WriteLine(message);
Могут ссылаться на несколько методов с совпадающей сигнатурой. Когда делегат вызывается, он вызывает все указанные методы в том порядке, в котором они были добавлены. Многоадресные делегаты создаются из обычных с помощью операторов += или -=.
DisplayMessage display = ShowMessage1;3) Обобщённые
display += ShowMessage2;
display("Hello, Multicast delegate!");
void ShowMessage1(string msg)
=> Console.WriteLine($"Message 1: {msg}");
void ShowMessage2(string msg)
=> Console.WriteLine($"Message 2: {msg}");
Используют параметры типа, что позволяет им работать с несколькими типами без приведения или упаковки/распаковки. C# предоставляет три встроенных обобщённых делегата: Func, Action и Predicate.
- Func<TResult>: представляет функцию с возвращаемым типом.
- Action: представляет метод, возвращающий void, без параметров.
- Predicate<T>: представляет метод, который принимает входной параметр и возвращает логическое значение.
Func и Action имеют перегрузки, принимающие большее количество аргументов.
Func<int, int, int> add =См. также:
(x, y) => x + y;
int sum = add(10, 20);
Action<string> display =
msg => Console.WriteLine(msg);
display($"Sum: {sum}");
Predicate<string> startsWithHello =
x => x.StartsWith("Hello, ");
bool checkHello = startsWithHello("Hello, delegate");
- Управление цепочками делегатов
- Анонимные методы
- Лямбда-выражения
Источник: https://dev.to/bytehide/20-c-interview-questions-for-experienced-2023-1hl6