@beduin01

Почему методы нельзя передавать в функции без делегатов?

Как я понимаю делегаты это указатели на методы в классе. С помощью делегатов эти методы можно дергать.
Вопрос в том, зачем делегаты вообще нужны? Почему нельзя просто методы класса вызывать напрямую? Зачем лишняя сущность?
  • Вопрос задан
  • 759 просмотров
Решения вопроса 1
Nipheris
@Nipheris Куратор тега C#
Делегаты - это форма существования функтора на платформе .NET. Почитайте про функтор, и поймете (наверное), зачем нужен делегат.

Если коротко и грубо - вызвать напрямую можно всегда только конкретный метод, который будет четко известен еще на стадии компиляции. Если же вы пишете некий обобщенный алгоритм и заранее не знаете, какие КОНКРЕТНО методы у каких КОНКРЕТНО объектов будете вызывать - вам необходимо будет воспользоваться делегатом.
Простейший пример - LINQ-методы. Метод фильтрации Where получает своим параметром функтор, который возвращает true или false, что значит - оставить элемент в коллекции или выкинуть его. В этом методе в цикле foreach вызывается переданный делегат для каждого элемента. Where понятия не имеет, какой конкретно метод (или лямбда-выражение) вы захотите подставить в качестве фильтрующего предиката.

Другой пример - события. События в дотнете - это делегаты с урезанным публичным интерфейсом. Так как, к примеру, кнопка не знает о том, кто захочет подписаться на событие ее нажатия, она никак не может вызвать конкретные методы у конкретных объектов. Чтобы иметь возможность сообщать о своем нажатии, кнопка выставляет событие Click наружу, давая возможность записать туда конкретные методы для вызова.

Кстати, делегат выполняет еще и функцию связывания: для нестатических методов делегат хранит еще и объект, для которого будет вызван instance-метод (т.е. связывает пару объект-метод).

Таким образом,
> Почему методы нельзя передавать в функции без делегатов?
Делегаты - это и есть передача методов в функции.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@jackroll
Сверхразум
Смысл делегатов можно понять только воспользовавшись ими на практике.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы