为啥我们需要回调事件?

Posted

技术标签:

【中文标题】为啥我们需要回调事件?【英文标题】:Why we need events for callback?为什么我们需要回调事件? 【发布时间】:2010-08-17 18:00:45 【问题描述】:

我们可以使用委托调用回调方法。 例如,

公共委托 bool ContinueProcessing();

// 后面我们可以写代码,

ContinueProcessing cp = new ContinueProcessing(IsDataAvailable);

cp += new ContinueProcessing(IsTransactionComplete);

//稍后在方法的代码定义中

bool IsDataAvailable() 返回真;

bool IsTransactionComplete() 返回真;

cp.Invoke() ;

上面的调用会依次调用两个布尔方法。 为什么我们需要“事件”? “事件”的目的是什么?

【问题讨论】:

【参考方案1】:

事件是回调,您可以在其中拥有多个互不干扰且不能互相调用的订阅者。

委托提供“这是我要采取的行动”的封装,事件提供对发布/订阅模型的封装。

更多信息请查看我的article on events。

【讨论】:

【参考方案2】:

代表非常通用。它们可以在任何上下文中使用:在同一个类中、类之间、静态方法中等等。

事件更具体——它们专门设计用于一个类订阅另一个类引发的事件。

Delegate 是一种(某种)类型安全的指向函数的指针,而 event 是委托的包装器,它提供了订阅/取消订阅/引发事件的标准接口。

【讨论】:

事件仅在委托周围添加“添加”和“删除”方法。我们可以在不提及“事件”的情况下实现一切。为什么说代表更通用? 代表更通用,因为它们可以用于更广泛的场景选择。你可以用委托做很多事情,包括实现事件,但是用事件你只能做一件事:事件。【参考方案3】:

看起来'event'关键字是委托声明的修饰符,允许它包含在接口中,限制它从声明它的类中调用,为它提供一对可定制的访问器(添加和删除)并强制委托的签名(在 .NET 框架中使用时)。

【讨论】:

以上是关于为啥我们需要回调事件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能可靠地捕获 mouseout 事件?

为啥我不能可靠地捕获 mouseout 事件?

Android 基于回调的事件处理机制详解

Nodejs 异步编程 - 为啥需要“异步”模块?啥是“回调地狱”/“末日金字塔”?

解决回调函数

为啥我们不能在当前队列上使用 dispatch_sync?