Что такое делегаты и как они связаны с передачей методов?
Что проверяют
Понимаете ли вы, что делегат это полноценный тип, а не украшение синтаксиса, и умеете ли объяснить, зачем языку понадобилась передача поведения. Вопрос ведёт к событиям, лямбдам и LINQ, поэтому ответ оценивают вместе с продолжением.
Как отвечать
Делегат описывает сигнатуру, а его экземпляр хранит пару: целевой объект и метод. Поэтому через делегат передаются и статические, и экземплярные методы, а лямбда дополнительно удерживает захваченные переменные.
Собственное объявление на практике нужно редко, хватает готовых Action, Func и Predicate. Своё оправдано именем в публичном контракте, параметрами ref и out или требуемой вариантностью.
Action<string> log = Console.WriteLine;
log += message => File.AppendAllText("app.log", message);
Func<int, bool> isOdd = n => n % 2 != 0;
var odd = numbers.Where(isOdd).ToList();Важное свойство: делегат многоадресный. Подписки складываются, вызов проходит по списку по порядку, у функции с результатом наружу отдаётся результат последнего вызова, а исключение в середине оборвёт оставшихся. Событие это тот же делегат с ограниченным доступом: снаружи разрешены только подписка и отписка.
Где спотыкаются
Не могут выбрать между делегатом и интерфейсом. Ориентир простой: одна операция, передаваемая по месту, это делегат, набор связанных операций с состоянием это интерфейс.
Забывают отписываться. Подписка держит ссылку на получателя, и пока живёт издатель, получатель не собирается. Отдельная беда с лямбдой: отписать её можно только по сохранённой ссылке, повторно записанное такое же выражение это уже другой объект.
Проверяют событие на null одной строкой, а вызывают следующей. Между ними подписчик может отписаться из другого потока. Правильно копировать в локальную переменную или вызывать через условный доступ.