委托和回调是相同的还是类似的吗?

61

委托和回调函数是相同的吗?还是它们有某种关联?


13
这会是一个很棒的面试问题 :o) - wcm
5个回答

51
“回调”是一个编码设计模式的术语,在具有函数指针或类似于函数指针(委托的功能)的任何语言中都可用。
在此模式中,您将一个指向函数的指针传递给另一个函数,以便在被调用的函数内部,它可以“回调”您传递给它的函数。通过每次调用时传递不同的“回调”函数的指针,您可以从方法外部控制大块的内部行为。排序算法需要传递一个指向一个函数的指针,该函数将“比较”列表中任意一对对象,以确定哪个在前面。在对sort方法进行一次调用时,您可能会传递一个按对象名称比较的回调函数,并且另一次可能会传递按对象重量比较的函数等。
相比之下,“委托”是一个特定的.Net类型,它充当一个特定签名的函数指针的容器... 在.Net托管代码中,委托是创建和使用函数指针的唯一方式。因此,在.Net中进行回调时,实际上是要传递一个委托...但是,除了回调之外,委托也可以用于其他场景。(具体而言,委托还可以用于从.Net线程池实现多线程)
回调还用于实现“观察者”模式(在.Net中使用事件来实现,这些事件本身是一种特殊类型的委托)。

7
otoh = "on the other hand",翻译为“另一方面”。 - software_writer
我知道这个答案很旧,但是委托不再仅限于.Net - Sam

16

(我假设你在谈论.NET。 如果不是,请详细说明。)

代理是在.NET中实现回调的惯用方法-但您并不必如此。 例如,您可以使用接口。(特别是,您可以使用一个带有一个方法用于错误调用和一个方法用于成功调用的回调。当然,您也可以取而代之使用两个委托...)

除了在.NET回调之外,代理还有很多用途-它取决于您认为什么是回调,但GUI事件处理程序,线程启动器,在LINQ to Objects中使用的过滤器和投影等都使用代理。


8

它们是密切相关的。 代理是回调函数的描述:

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);
}

20
干得好,你将“MyFunctionThatGetsTheCallbackFunctionRef"中的“Ref”缩写了... 不想让函数名太长!! - Jamie - Fenrir Digital Ltd

6

通俗地讲,委托是一种用于访问拥有方法的对象之外的方法的对象,而回调是一个保存委托的变量。

在C#中,这两个术语可以互换使用。


1
服务类有一个名为委托的变量函数。 调用类有一个它想要运行的首选函数,称为回调。
调用类将委托设置为其回调函数。
委托和回调之间的区别在于视角:服务类调用设置为调用类回调的委托。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接