我在低级应用程序接口中看到了很多回调函数,比如Win32。但我对什么是回调函数或回调子例程感到困惑。c#中的事件是否被视为回调函数?
发布于 2011-05-08 04:33:40
回调函数是传递给其他函数的函数,该函数稍后将调用该函数以通知用户某些东西。这意味着必须有一种方法将对一个函数的引用传递给另一个函数,例如一种类型的函数指针。在.NET中,使用委托。
事件处理程序方法就是回调函数的一个示例。
发布于 2011-05-08 04:33:11
在.NET中,委托是与Win32应用编程接口类型回调最匹配的,尽管委托的功能要强大得多。事件本身是基于基础委托的。
在Win32应用编程接口中,回调最常见的用途是枚举资源或类似的东西。例如,EnumChildWindows应用程序接口将开始枚举特定窗口的所有子窗口,并为找到的每个子窗口调用自定义回调例程。在该回调中,您可以执行与特定子窗口相关的、与您的需求相关的任何操作,例如,您可能正在尝试枚举窗口,以便根据与该窗口相关的一些自定义条件以编程方式查找特定窗口,一旦找到该窗口,您就可以通过从回调中返回false来强制终止枚举。
在.NET中,使用回调的这种模式不是必需的,因为可以使用IEnumerable接口获得更正式的解决方案。
发布于 2011-05-08 04:40:33
回调是continuations的一种特殊情况。引用PFPL,第30章:
第一类续集...是具有indefinite生存期的普通值,可以在计算中随意传递和返回。延续永远不会“过期”,并且在不损害安全性的情况下恢复延续始终是明智的。因此,延续支持无限的“时间旅行”-我们可以返回到计算中的前一个点,然后根据需要返回到它未来的某个点。
为什么延续是有用的?从根本上说,它们是计算在给定时间点的控制状态的表示。使用延续,我们可以“检查点”程序的控制状态,将其保存在数据结构中,并在稍后返回
因此,回调只是延续的另一个例子。它们对异步事件处理的使用源于通过延续将执行恢复到某种状态的能力。
在具有一类函数和高阶函数的语言中,延续特别容易使用。
参考文献:Practical Foundations for Programming Languages,Robert Harper,2011年。
https://stackoverflow.com/questions/5923789
复制相似问题