Функции обратного вызова: что это за языки программирования? - PullRequest
1 голос
/ 08 мая 2011

Я вижу много функций обратного вызова в низкоуровневых API, таких как Win32. Но я не совсем понимаю, что такое функция обратного вызова или подпрограмма обратного вызова. Считается ли событие в c # функцией обратного вызова?

Ответы [ 3 ]

4 голосов
/ 08 мая 2011

Функция обратного вызова - это функция, которая передается чему-то другому, которая позже будет вызывать функцию, чтобы уведомить пользователя о чем-либо.Это подразумевает, что должен быть способ передать ссылку на функцию другой, например, указатель типа функции.В .NET используются делегаты.

Метод обработчика событий является примером функции обратного вызова.

3 голосов
/ 08 мая 2011

Обратные вызовы являются частным случаем продолжений . Процитирую PFPL, ch 30:

[первоклассные] продолжения ... это обычные значения с неопределенным временем жизни, которые могут быть переданы и возвращены по желанию в вычислении. Продолжения никогда «Истекает», и всегда целесообразно восстановить продолжение без ущерба для безопасности. Таким образом, продолжения поддерживают неограниченное «путешествие во времени» - мы можем вернуться к предыдущей точке вычисления и затем вернуться к какой-то момент в его будущем, по желанию.

Почему продолжения полезны? По сути, они являются представлениями контрольного состояния вычислений в данный момент времени. Используя продолжения, мы можем «проверить» состояние управления программой, сохранить ее в структура данных и возврат к ней позже

Таким образом, обратные вызовы являются еще одним примером продолжения. Их использование для асинхронной обработки событий следует из способности восстановить выполнение до некоторого состояния посредством продолжения.

Продолжения особенно просты в использовании в языках с функциями первого класса и функциями высшего порядка.


Ссылки : Практические основы программирования Языки , Роберт Харпер, 2011.

3 голосов
/ 08 мая 2011

В .NET делегат наиболее близок к обратному вызову типа Win32 API, хотя делегат гораздо более функциональный. Сами события основаны на базовых делегатах.

Наиболее распространенное использование для обратного вызова в Win32 API - это перечисление ресурса или чего-то подобного. Например, API EnumChildWindows запустит перечисление всех дочерних окон определенного окна и вызовет пользовательскую процедуру обратного вызова для каждого найденного дочернего окна. В рамках этого обратного вызова вы можете выполнять любые действия, относящиеся к вашему требованию, которые относятся к конкретному дочернему окну, например, вы можете пытаться перечислить окна, чтобы программно найти конкретное окно на основе некоторых пользовательских критериев, которые относятся к этому окну, и как только вы найдете окно, вы можете принудительно завершить перечисление, возвращая false из обратного вызова.

В .NET такой шаблон использования обратного вызова не требуется, поскольку более формализованное решение доступно с использованием интерфейса IEnumerable .

...