Вы можете в основном думать о делегатах как о интерфейсах с одним методом. Поэтому в тех случаях, когда язык без делегатов (например, Java) будет использовать интерфейс, имеет смысл иметь делегата.
Делегаты имеют следующие преимущества перед интерфейсами:
- Реализация может быть закрытой, тогда как методы, реализующие интерфейсы, должны быть открытыми в Java. (C # также имеет явную реализацию интерфейса.)
- Вы можете реализовать несколько делегатов в одном классе или даже один и тот же тип делегата несколько раз
- Фреймворк и язык имеют дополнительную поддержку для делегатов:
- Объединяя их вместе (и удаляя их)
- Паб / субкаркас (события)
- Фоновый вызов с использованием пула потоков (BeginInvoke и т. Д.)
- Лямбда-выражения и анонимные методы упрощают создание «встроенных»
- Деревья выражений, представляющие логику выражения в данных, а не IL
Делегаты обычно используются для:
- Обработка событий, например в графическом интерфейсе
- Предоставление «маленьких» фрагментов поведения, например, фильтры и проекции в LINQ
- Обратные вызовы для асинхронного программирования
Думайте о них как о способе инкапсулировать один фрагмент поведения и посмотрите, куда вас это приведет.