【发布时间】:2011-05-07 20:29:36
【问题描述】:
我在 Win32 等低级 API 中看到了很多回调函数。但我对回调函数或回调子程序是什么感到困惑。 c# 中的事件是否被视为回调函数?
【问题讨论】:
标签: function programming-languages callback continuations subroutine
我在 Win32 等低级 API 中看到了很多回调函数。但我对回调函数或回调子程序是什么感到困惑。 c# 中的事件是否被视为回调函数?
【问题讨论】:
标签: function programming-languages callback continuations subroutine
回调函数是一个传递给其他东西的函数,它稍后会调用该函数来通知用户某事。这意味着必须有一种方法可以将对函数的引用传递给另一个函数,例如一种函数指针。在 .NET 中,使用了委托。
事件处理方法是回调函数的一个例子。
【讨论】:
在 .NET 中,委托是最接近 Win32 API 类型回调的匹配项,尽管委托的功能要强大得多。事件本身基于底层委托。
Win32 API 中回调的最常见用途是枚举资源或类似的东西。例如,EnumChildWindows API 将启动特定窗口的所有子窗口的枚举,并为找到的每个子窗口调用您的自定义回调例程。在该回调中,您可以执行与特定子窗口相关的要求相关的任何操作,例如,您可能会尝试枚举窗口以根据与该窗口相关的一些自定义条件以编程方式查找特定窗口,并且找到窗口后,您可以通过从回调中返回 false 来强制终止枚举。
在 .NET 中,这种使用回调的模式不是必需的,因为使用 IEnumerable 接口可以获得更正式的解决方案。
【讨论】:
回调是continuations 的一种特殊情况。引用 PFPL,第 30 章:
[first class] continuations ... 是具有无限生命周期的普通值 可以在计算中随意传递和返回。续集从不 “过期”,在不影响安全性的情况下恢复延续总是明智的。因此延续支持无限的“时间旅行”——我们可以回到计算中的前一点,然后返回 未来的某个时间点,随意。
为什么延续有用?从根本上说,它们是代表 计算在给定时间点的控制状态。使用延续我们可以“检查点”程序的控制状态,将其保存在 数据结构,稍后返回
因此,回调只是延续的另一个例子。它们对异步事件处理的使用源于通过延续将执行恢复到某种状态的能力。
连续在具有一等函数和高阶函数的语言中特别容易使用。
参考文献:Practical Foundations for Programming Languages,罗伯特·哈珀,2011 年。
【讨论】: