代码之家  ›  专栏  ›  技术社区  ›  GurdeepS

为什么MSDN站点使用委托和接口进行比较?

c#
  •  1
  • GurdeepS  · 技术社区  · 14 年前

    谢谢

    2 回复  |  直到 14 年前
        1
  •  5
  •   Ani    14 年前

    可以将委托视为等同于使用单个方法的接口。在不支持委托的语言中,通常使用委托的模式通常是使用接口编写的。

    例如,Java使用 anonymous inner classes 实现接口,在该接口中通常使用C#中的匿名委托/lambda表达式:

    爪哇语:

    // anonymous inner class that implements an interface
    Runnable runnable = new Runnable()
                           { 
                               public void run()
                               { 
                                 System.out.println("Hello world"); 
                               } 
                           });
    
    Thread thread = new Thread(runnable);
    

    // lambda expression convertible to a delegate-type
    ThreadStart ts = () => Console.WriteLine("Hello world");
    
     Thread thread = new Thread(ts);
    

    在这两种情况下,目的都是为线程提供一个入口点。一种方法使用接口,另一种方法使用委托,但是如果忽略“管道”,很明显接口的作用与委托相同。注意,使用lambda表达式来表达这个想法的可用性是 代表专用。 Project Lambda 必要地 需要委托类型。

    即使在.NET框架中,接口类型和委托类型之间也存在等价性,例如 Comparison<T> IComparer<T> .

    编辑:更新代码,使区别更清楚。

        2
  •  1
  •   Steve Ellinger    14 年前

    就委托而言,这通常是通过事件完成的。ClassB将定义一个事件(它将基于委托),ClassA将通过构建绑定到其方法之一的委托,然后将委托与ClassB中的委托组合,将自己绑定到该事件。当ClassB想要与ClassA通信时,它只需调用与事件相关联的委托。

    在这两种情况下,ClassB都不知道ClassA的存在,但ClassB仍然能够与ClassA通信。