.net - 使用委托(delegate)的优点?

标签 .net design-patterns delegates

我希望在 VB.NET 或 C# 或其他一些一流的 .NET 语言中实现观察者模式。我听说委托(delegate)可以用于此目的,但不明白为什么它们比观察者上实现的普通旧接口(interface)更受青睐。所以,

  • 为什么我应该使用委托(delegate)而不是定义自己的接口(interface)并传递对实现它们的对象的引用?
  • 为什么我想避免使用委托(delegate),而采用良好的老式界面?

最佳答案

当您可以直接调用方法时,您不需要委托(delegate)。

当调用方法的代码不知道/关心它调用的方法是什么时,委托(delegate)非常有用 - 例如,您可能调用一个长时间运行的任务并向其传递一个委托(delegate)任务可用于发送有关其状态的通知的回调方法。

这是一个(非常愚蠢的)代码示例:

enum TaskStatus
{
   Started,
   StillProcessing,
   Finished
}

delegate void CallbackDelegate(Task t, TaskStatus status);

class Task
{
    public void Start(CallbackDelegate callback)
    {
        callback(this, TaskStatus.Started);

        // calculate PI to 1 billion digits
        for (...)
        {
            callback(this, TaskStatus.StillProcessing);
        }

        callback(this, TaskStatus.Finished);
    }
}

class Program
{
    static void Main(string[] args)
    {
        Task t = new Task();
        t.Start(new CallbackDelegate(MyCallbackMethod));
    }

    static void MyCallbackMethod(Task t, TaskStatus status)
    {
        Console.WriteLine("The task status is {0}", status);
    }
}

正如您所看到的,Task 类不知道也不关心——在本例中——委托(delegate)是一个将任务状态打印到控制台的方法。该方法同样可以通过网络连接将状态发送到另一台计算机。等等

关于.net - 使用委托(delegate)的优点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/302819/

相关文章:

c# - Entity Framework - 循环遍历属性以进行更新

c# - 在 C# 中将 MIDI 消息发送到 DAW

c# - 获取公共(public) Internet IP 地址/geo loc 的智能方法

Java接口(interface)设计模式情况

c# - C#事件的奇怪之处

c# - 打破委托(delegate)内的循环

c# - SOAP WCF Webservice 在本地或远程调用时表现不同

java - 多个类加载器和 VM 案例中的单例

ios - Swift:在委托(delegate)方法中使用 presentViewController 时为 "Attempt to present ViewController whose view is not in the window hierarchy"

javascript - 使用什么 JavaScript 设计模式/常见实践来通过页面特定调用来组织多个函数