委托与回调是一回事吗?或者它们是否以某种方式相关?
5 回答
“回调”是指编码设计模式的术语,可用于任何具有函数指针的语言或函数指针的类似物(有点像委托)
在这种模式中,您将一个函数指针传递给另一个函数,以便在被调用函数中,它可以“回调”您传递给它的函数。通过这种方式,您可以从方法外部控制方法的大部分内部行为,方法是每次调用时将指针传递给不同的“回调”函数......回调的一个例子是当你有一个排序算法时必须传递一个指向函数的指针,该函数将“比较”要排序的列表中的任意一对对象,以确定哪个在另一个之前。在一次调用 sort 方法时,您可能会传递一个按对象名称进行比较的回调函数,而另一次则传递一个按对象权重或其他方式进行比较的函数...
委托,otoh,是一种特定的 .Net 类型,它充当函数指针的特定于签名的容器......在 .Net 托管代码中,委托是创建和使用函数指针的唯一方法。所以在.Net中做回调,其实是在传递一个委托……但是委托除了回调之外还可以用在其他场景。(具体来说,委托也可用于实现 .Net 线程池中的多线程)
回调也用于实现“观察者”模式(在 .Net 中使用事件实现,事件本身就是一种特殊类型的委托)
(我假设您在这里谈论的是 .NET。如果不是,请详细说明。)
委托是在 .NET 中实现回调的惯用方式 - 但您不必这样做。例如,您可以使用接口。(特别是你可以有一个回调,一个方法调用错误,一个调用成功。当然,你可以取两个委托......)
除了 .NET 中的回调之外,委托还有很多用途——它完全取决于您认为回调的内容,但是 LINQ to Objects 中的 GUI 事件处理程序、线程启动器、过滤器和投影(以及更多!)都使用委托。
它们是手牵手相关的。委托是对回调函数外观的描述:
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);
}
通常,委托是用于访问拥有该方法的对象外部的方法的对象,而回调是保存委托的变量
在 C# 中,这些术语可以互换使用
服务类有一个称为委托的变量函数。调用类有一个它想要运行的首选函数,称为回调。
调用类将委托设置为其回调。
委托和回调之间的区别在于视角:服务类调用设置为调用类回调的委托。