C# 传递委托和接口之间的区别?

C# 传递委托和接口之间的区别?,c#,delegates,C#,Delegates,传递委托和向方法传递接口之间有什么主要区别吗?我将c#委托视为“方法接口”。在此透视图中,传递委托和仅使用一个方法传递精简接口之间没有区别。我尝试创建小型接口(SRP),所以我总是认为代理有点多余。但是我遗漏了什么吗?单个方法接口在功能上与委托几乎相同。当然,对于要传递的每个“方法”,都需要一个派生类 从实现的角度来看,两者非常相似。委托存储函数指针。接口对象引用的vtable中有一个函数指针 我相信。委托确实可以被视为单一方法的接口/契约,因此与接口类似。它们之间的主要区别在于语言语法,特别是

传递委托和向方法传递接口之间有什么主要区别吗?我将c#委托视为“方法接口”。在此透视图中,传递委托和仅使用一个方法传递精简接口之间没有区别。我尝试创建小型接口(SRP),所以我总是认为代理有点多余。但是我遗漏了什么吗?

单个方法接口在功能上与委托几乎相同。当然,对于要传递的每个“方法”,都需要一个派生类

从实现的角度来看,两者非常相似。委托存储函数指针。接口对象引用的vtable中有一个函数指针


我相信。

委托确实可以被视为单一方法的接口/契约,因此与接口类似。它们之间的主要区别在于语言语法,特别是对匿名方法和(自C#3.0以来)lambdas的支持

如果要为所有接口和委托创建显式、命名的实现,那么代码将非常相似:

var item = myList.FindBySelector(SelectorMethod); // delegate-based;
var item = myList.FindBySelector(new MySelectorImpl()); // interface-based.

但是,如果您要匿名类型,它可以在界面上变得更复杂——请考虑来自java 7的一个例子,它支持Java匿名类型,但不支持匿名方法:

var item = myList.FindBySelector(new SelectorDelegate(item => item.IsTheOne));
vs

因此,如果你要跳进匿名方法的兔子洞,那么使用委托就更有意义了,因为你只处理方法接口,而不处理类接口。

特别是,C#采取了这一特定的路线(与Java中的匿名类方法相反),因此,您必须在不需要创建全新命名类型的地方使用委托。C#的委托类型推断使得委托的使用非常简单和流畅,因此在适当的情况下,它是接口的最佳选择。
Item item = myList.FindBySelector(new ISelector () 
{
   @Override
   public boolean apply(Item item) 
   {
       return item.IsTheOne;
   }
});