Вот пример, который может помочь.
Существует приложение, которое использует большой набор данных. Необходима функция, позволяющая фильтровать данные. Можно указать 6 различных фильтров.
Непосредственной задачей является создание 6 различных методов, каждый из которых возвращает отфильтрованные данные. Например
public Data FilterByAge (int age)
public Data FilterBySize (int size)
.... и т. Д.
Это нормально, но очень ограниченно и создает мусорный код, потому что он закрыт для расширения.
Лучший способ - использовать один метод Filter и передавать информацию о том, как следует фильтровать данные. Это где делегат может быть использован. Делегат - это функция, которую можно применить к данным для их фильтрации.
общедоступный фильтр данных (фильтр действий)
тогда код для использования становится
Фильтр (data => data.age> 30);
Фильтр (data => data.size = 19);
Код данных => бла-бла становится делегатом. Код становится намного более гибким и остается открытым.