Are delegates not just shorthand interfaces?假设我们有:
现在,我们可以将Bar和Baz折腾为Foos,并将其称为Func方法。 代表们简化了一点:
现在,我们可以作为Foo代表在Bar和Baz周围折腾。 除了获得较短的代码外,委托的真正好处是什么? 有一点细微的差别,委托可以访问定义了它们的类的成员变量。在C#中(不同于Java),所有内部类都被认为是静态的。因此,如果您使用接口来管理回调,例如按钮的ActionListener。实现的内部类需要(通过构造函数)传递对包含类的部分的引用,该类在回调期间可能需要与之交互。代表没有此限制,因此减少了实现回调所需的代码量。 较短,更简洁的代码也是值得的。 从软件工程的角度来看,您是对的,代表与函数接口非常相似,因为它们为函数接口提供了原型。 它们也可以以相同的方式使用:与传递包含所需方法的整个类(而不是传递整个类)相比,您可以仅传递一个委托。这样可以节省大量代码,并创建更具可读性的代码。 而且,随着lambda表达式的出现,现在也可以轻松地对其进行快速定义,这是一个巨大的好处。尽管可以使用C#动态地构建类,但实际上这是一个巨大的难题。 将两者进行比较是一个有趣的概念。从用例和代码结构的角度来看,我以前从未考虑过这些想法有多相似。 从调用者的角度来看,委托与具有单个方法的接口引用确实有很多共同点。 在第一个示例中,Baz和Bar是类,可以继承和实例化。在第二个示例中,Baz和Bar是方法。
您不能将接口引用仅应用于与接口协定匹配的任何类。该类必须显式声明它支持该接口。
您不能在接口协定中包含静态方法。 (尽管您可以将静态方法与扩展方法结合使用)。 可以将委托视为方法的接口,该接口定义方法必须具有什么样的参数和返回类型才能适合委托 您可以将委托作为函数中的参数传递(在技术上,委托在编译时可以成为对象,但这不是重点)。您可以(显然)将一个对象作为参数传递,但是随后您将该类型的对象与该函数绑定为参数。使用委托,您可以传递任何函数以在具有相同签名的代码中执行,而不管其来自何处。 不,委托用于方法指针。然后,可以确保与委托关联的方法的签名正确。 另外,您也无需知道类的结构。这样,您可以使用已编写的方法传递给另一个类中的方法,并定义要实现的功能。 使用Find方法查看List <>类。现在,您需要定义什么来确定某项是否匹配,而无需该类中包含的项实现IListFindable或类似项。 在至少一个向Java中添加闭包(即匿名委托)的建议中,它们等效于具有单个成员方法的接口。 接口和委托是完全不同的两件事,尽管我理解为了易于理解而用类似接口的术语描述委托的诱惑……但是,不了解真相可能会导致混乱。 代表们受到了启发(部分)是由于C ++方法指针的黑色艺术不足以实现某些目的。 一个经典的示例是实现消息传递或事件处理机制。 委托使您可以定义方法签名,而无需了解类的类型或接口-我可以定义一个" void eventHandler(Event * e)"委托,并在实现它的任何类上调用它。 有关此经典问题的一些见解以及为什么希望代表参加,请先阅读此内容,然后再阅读此内容。 是的,可以将委托视为一种方法的接口。 委托是类型化方法指针。与接口相比,它具有更大的灵活性,因为您可以利用协方差和协方差,并且可以修改对象状态(必须将this指针与基于接口的函子一起传递)。 另外,代表有很多不错的语法糖,使您可以轻松地将它们组合在一起。 |