По моему мнению, функция более высокого порядка - это функция, которая берет другую функцию и использует ее для абстрагирования некоторого поведения, например, этот метод расширения c #:
public static IEnumerable<T> OrderByProperty<T>(this IEnumerable<T> items, Func<T, object> selector)
{
return items.Select(x => new { o = selector(x), item = x })
.OrderBy(x => x.o)
.Select(x=> x.item);
}
принимает функцию, определяющую, какое свойство нужно учитывать при сортировке коллекции.
Пример использования:
var orderedByA = Enumerable.Range(0, 100)
.Select(x=> new Item{
A = x,
B = 100 - x
})
.OrderByProperty(x => x.A);
С другой стороны, обратные вызовы могут использоваться для продолжения потока приложения, когда требуется некоторое асинхронное или длинное действие, например,
void FirstAsync(){
Task.Run(()=>{
Thread.Sleep(1000);
Console.WriteLine("First executed");
});
}
void Second()
{
Console.WriteLine("Second executed");
}
void FirstV2(Action callback)
{
Task.Run(() =>
{
Thread.Sleep(1000);
Console.WriteLine("First executed");
callback?.Invoke();
});
}
void Main()
{
FirstAsync();
Second();
Thread.Sleep(2000);
FirstV2(Second);
}
Вывод программы выше будет такой:
Second executed
First executed
First executed
Second executed