回调函数:它们在计算机编程语言中是什么



我在Win32等低级API中看到了很多回调函数。但我对回调函数或回调子例程是什么感到困惑。C# 中的事件是否被视为回调函数?

回调函数是传递给其他内容的函数,稍后将调用该函数以通知用户某些内容。这意味着必须有一种方法可以将对一个函数的引用传递给另一个函数,例如一种函数指针。在 .NET 中,使用委托。

事件处理程序方法是回调函数的一个示例。

在 .NET 中,委托与 Win32 API 类型回调最接近,尽管委托的功能要强得多。事件本身基于基础委托。

Win32 API 中回调的最常见用途是枚举资源或类似内容。例如,EnumChildWindows API 将启动特定窗口的所有子窗口的枚举,并为找到的每个子窗口调用自定义回调例程。在该回调中,您可以执行与特定子窗口相关的与需求相关的任何操作,例如,您可能尝试枚举窗口以编程方式根据与该窗口相关的某些自定义条件查找特定窗口,找到窗口后,您可以通过从回调返回false来强制终止枚举。

在 .NET 中,这种使用回调的模式不是必需的,因为可以使用 IEnumerable 接口提供更正式的解决方案。

调是延续的一种特定情况。引用PFPL第30章的话:

[头等舱]延续...是具有无限期生存期的普通值 可以在计算中随意传递和返回。从不延续 "过期",在不影响安全性的情况下恢复延续始终是明智的。因此,延续支持无限的"时间旅行"——我们可以回到计算中的前一点,然后返回到 它未来的某个点,随意。

为什么延续有用?从根本上说,它们是表示 给定时间点计算的控制状态。使用延续,我们可以"检查点"程序的控制状态,将其保存在 数据结构,稍后返回

因此,回调只是延续的另一个例子。它们在异步事件处理中的使用源于通过延续将执行恢复到某种状态的能力。

延续在具有一等函数和高阶函数的语言中特别容易使用。


参考资料:编程的实用基础语言,罗伯特·哈珀,2011年。

最新更新