我在Win32这样的低级API中看到了很多回调函数。但我对回调函数或回调子例程的含义感到困惑。 c#中的事件是否被视为回调函数?
答案 0 :(得分:4)
回调函数是一个传递给其他东西的函数,稍后会调用该函数来通知用户某些东西。这意味着必须有一种方法将函数的引用传递给另一个函数,例如一种函数指针。在.NET中,使用了委托。
事件处理程序方法是回调函数的一个示例。
答案 1 :(得分:3)
在.NET中,委托是与Win32 API类型回调最接近的匹配,尽管委托功能更强大。事件本身基于潜在的代表。
Win32 API中回调最常见的用途是枚举资源或类似内容。例如,EnumChildWindows API将启动特定窗口的所有子窗口的枚举,并为找到的每个子窗口调用自定义回调例程。在该回调中,您可以执行与您的需求相关的任何与特定子窗口相关的操作,例如,您可能尝试枚举窗口以根据与该窗口相关的某些自定义条件以编程方式查找特定窗口,以及找到窗口后,您可以通过从回调中返回false
来强制终止枚举。
在.NET中,这种使用回调的模式不是必需的,因为使用IEnumerable接口可以获得更正式的解决方案。
答案 2 :(得分:3)
回调是continuations的特定情况。引用PFPL,第30章:
[头等]延续...是具有无限生命的普通值 可以在计算中随意传递和返回。永远不会延续 “过期”,在不影响安全的情况下恢复延续总是明智的。因此,continuation支持无限的“时间旅行” - 我们可以回到计算中的前一点然后返回 在未来的某些方面,随意。
为什么延续有用?从根本上说,它们是代表 在给定时间点的计算的控制状态。使用continuation,我们可以“检查”程序的控制状态,将其保存在 数据结构,稍后再返回
因此,回调只是延续的另一个例子。它们用于异步事件处理的能力来自通过延续将执行恢复到某些状态的能力。
Continuations特别易于在具有一级函数和高阶函数的语言中使用。
参考文献:Practical Foundations for Programming Languages,Robert Harper,2011。