Ответ
В C# делегаты — это типобезопасные указатели на методы. Основные виды:
-
Пользовательские делегаты (обычные) — объявляются с ключевым словом
delegate. Используются реже, так как в большинстве случаев их заменяютActionиFunc.delegate int StringToIntConverter(string input); -
Action— предопределённый обобщённый делегат для методов, которые не возвращают значение (возвращаютvoid). Может принимать от 0 до 16 параметров.Action<string> logAction = (message) => Console.WriteLine($"[LOG]: {message}"); Action<int, int> sumAction = (a, b) => Console.WriteLine(a + b); -
Func— предопределённый обобщённый делегат для методов, которые возвращают значение. Последний параметр типа всегда указывает на возвращаемый тип.Func<int, int, int> addFunc = (a, b) => a + b; Func<string, bool> isNotEmptyFunc = (str) => !string.IsNullOrEmpty(str); -
Predicate<T>— специализированный делегат для проверки условия. Возвращаетbool. По сути, это аналогFunc<T, bool>, но с более ясным намерением в коде.Predicate<int> isEvenPredicate = (number) => number % 2 == 0; // Эквивалентно: Func<int, bool> isEvenFunc = ... -
EventHandlerиEventHandler<TEventArgs>— стандартные делегаты для реализации событийной модели.public event EventHandler SomethingHappened; public event EventHandler<FileLoadedEventArgs> FileLoaded;
Почему это важно: Action и Func устраняют необходимость вручную объявлять множество делегатов, делая код чище и более унифицированным. Все делегаты в C# являются мультикаст-делегатами — они могут содержать ссылки на несколько методов и вызывать их по цепочке.
Action multiAction = () => Console.Write("Hello, ");
multiAction += () => Console.WriteLine("World!");
multiAction(); // Выведет: "Hello, World!" Видео-ответы
▶
▶
▶
▶
▶
▶