【问题标题】:Are delegates and callbacks the same or similar?委托和回调是否相同或相似?
【发布时间】:2008-11-14 17:41:46
【问题描述】:

委托与回调是一回事吗?还是它们有某种关联?

【问题讨论】:

  • 这将是一个很棒的面试问题:o)

标签: .net callback delegates


【解决方案1】:

“回调”是指编码设计模式的术语,可以在任何具有函数指针的语言中使用,或类似于函数指针(有点像委托)

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

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

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

【讨论】:

  • otoh = "另一方面"
  • 我知道这个答案是旧的,但代表不再只是在.Net
【解决方案2】:

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

委托是在 .NET 中实现回调的惯用方式 - 但您不必这样做。例如,您可以使用接口。 (特别是你可以有一个回调,一个方法调用错误,一个方法成功。当然,你可以取两个委托......)

除了 .NET 中的回调之外,委托还有很多用途——它完全取决于您认为回调是什么,但 LINQ to Objects 中的 GUI 事件处理程序、线程启动器、过滤器和投影(以及更多!)使用委托。

【讨论】:

    【解决方案3】:

    它们是密切相关的。 委托是对回调函数外观的描述:

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

    【讨论】:

    • 干得好,你在MyFunctionThatGetsTheCallbackFunctionRef 中缩写了Ref...不想名字太长!!
    【解决方案4】:

    一般来说,委托是一个对象,用于访问拥有该方法的对象外部的方法,而回调是一个持有委托的变量

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

    【讨论】:

      【解决方案5】:

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

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

      委托和回调的区别在于视角:服务类调用设置为调用类回调的委托。

      【讨论】:

        猜你喜欢
        • 2013-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-22
        相关资源
        最近更新 更多