传递委托和界面之间的区别?

Mor*_*ten 2 c# delegates

传递委托和将接口传递给方法之间是否存在重大差异?我将c#delegate视为"方法接口".从这个角度来看,传递委托和仅使用一个方法传递瘦接口之间没有区别.我尝试制作小型接口(SRP),所以我总是认为委托有些多余.但我错过了什么吗?

Avn*_*tan 5

实际上,代理可以被视为单个方法的接口/契约,因此类似于接口.它们之间的主要区别在于语言语法,特别是对匿名方法的支持以及(自C#3.0以来)lambdas.

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

var item = myList.FindBySelector(SelectorMethod); // delegate-based;
var item = myList.FindBySelector(new MySelectorImpl()); // interface-based.
Run Code Online (Sandbox Code Playgroud)

但是,如果你要使用匿名类型,它可能会让接口变得更加混乱 - 请考虑这个来自C#的示例与来自Java 7的示例,后者支持匿名类型但不支持匿名方法:

var item = myList.FindBySelector(new SelectorDelegate(item => item.IsTheOne));
Run Code Online (Sandbox Code Playgroud)

Item item = myList.FindBySelector(new ISelector () 
{
   @Override
   public boolean apply(Item item) 
   {
       return item.IsTheOne;
   }
});
Run Code Online (Sandbox Code Playgroud)

因此,如果你正在跳过匿名方法的兔子洞,使用委托会更有意义,因为你处理方法接口,没有类接口围绕它.