代表和回调是相同还是相似?

时间:2008-11-14 17:41:47

标签: .net callback delegates

委托是否与回调相同?或者他们是以某种方式相关的?

5 个答案:

答案 0 :(得分:31)

“回调”是一个术语,指的是一种编码设计模式,可用于任何具有函数指针的语言,或模拟函数指针(有点像代表)

在此模式中,您将指向函数的指针传递给另一个函数,以便在被调用函数内,它可以“回调”您传递给它的函数。通过这种方式,您可以通过在每次调用时将指针传递给不同的“回调”函数来控制方法外部方法的一大块内部行为...回调的一个示例是当您有一个排序算法时必须传递一个指向函数的指针,该函数将“比较”要排序的列表中的任意对象对,以确定哪个对象先于另一对。在对sort方法的一次调用中,您可以传递一个回调函数,该函数按对象名称进行比较,另一次传递一个按对象权重进行比较的函数,或者其他...

委托,otoh,是一种特定的.Net类型,充当函数指针的特定于签名的容器......在.Net托管代码中,委托是创建和使用函数指针的唯一方法。所以在.Net中做一个回调,你实际上是在传递一个委托......但代理可以用在除回调之外的其他场景中。 (具体来说,委托也可以用来实现.Net线程池的多线程)

回调也用于实现“观察者”模式(使用事件在.Net中实现,事件本身就是一种特殊的代理类型)

答案 1 :(得分:15)

(我假设你在这里谈论.NET。如果没有,请详细说明。)

代理是在.NET中实现回调的惯用方法 - 但您不必这样做。例如,您可以使用界面。 (特别是你可以有一个回调,一个方法可以调用错误,一个回合成功。当然,你可以带两个代表......)

除了.NET中的回调之外,代表有很多用途 - 它完全依赖于你认为是回调的内容,但LINQ to Objects all中的GUI事件处理程序,线程启动器,过滤器和投影(以及更多!)使用代表。

答案 2 :(得分:4)

通常,委托是一个对象,用于访问拥有该方法的对象外部的方法,而回调是一个包含委托的变量

在C#中,这些术语可以互换使用

答案 3 :(得分:4)

他们是手拉手相关的。 委托是关于回调函数如何显示的描述:

delegate void MyDelegate(string Text);

然后你可以拥有一个可以将回调作为参数接收的函数。

//This will result in a MessageBox with "Lalalala"
MyFunctionThatGetsTheCallbackFunctionRef(MyCallBackFunc); 

void MyFunctionThatGetsTheCallbackFunctionRef(MyDelegate TheFunction){
 TheFunction("Lalalala");
}

void MyCallBackFunc(string Text){
  //my callback
  MessageBox.Show(Text);
}

答案 4 :(得分:1)

服务类具有一个称为委托的变量函数。 调用类具有要运行的首选函数,称为回调。

调用类将委托设置为其回调。

委托与回调之间的区别是透视图:服务类调用已设置为调用类回调的委托。