Why do we need C# delegates

Inf*_*ner 56 c# delegates

I never seem to understand why we need delegates? I know they are immutable reference types that hold reference of a method but why can't we just call the method directly, instead of calling it via a delegate?

Thanks

Jon*_*eet 59

简单回答:需要执行操作的代码不知道写入时要调用的方法.如果你在编译时知道要调用哪种方法,你只能直接调用该方法,对吧?因此,如果您想要抽象出"在适当的时间执行操作X"的想法,您需要对操作进行一些表示,以便调用操作的方法不需要提前知道确切的实现.

例如:

  • Enumerable.Select 在LINQ中,除非你告诉它,否则无法知道你想要使用的投影
  • 作者在用户点击它时Button不知道想要什么动作
  • 如果一个新线程只做了一件事,那将是非常无聊的......

它可能会帮助您将委托视为单方法接口,但具有大量语言语法以使其易于使用,并且支持异步执行和多播.


Tal*_*ner 33

当然,您可以直接在对象上调用方法,但请考虑以下方案:

  1. 您希望通过使用单个委托来调用一系列方法,而无需编写大量方法调用.
  2. 您希望优雅地实现基于事件的系统.
  3. 您希望在签名中调用两个相同但位于不同类中的方法.
  4. 您希望将方法作为参数传递.
  5. 你不想像在LINQ中那样编写很多多态代码,你可以为这个Select方法提供很多实现.


Ode*_*ded 17

因为您可能不具有该方法写入的,要么你在这样的它,用户可以决定什么方法(即用户写)用户想要你的类来执行的方式设计类.

它们还使某些设计更干净(例如,代替您调用不同方法的switch语句,调用传入的委托)并且更容易理解并允许扩展代码而不更改它(想想OCP).

代表也是事件系统的基础 - 编写和注册没有代表的事件处理程序将比使用它们更难.

看看Linq 的不同ActionFunc代表 - 如果没有它们,它几乎没有用.

话虽如此,没有人强迫你使用代表.


Nan*_*nda 8

  1. 代表们支持活动
  2. 代理为您的程序提供了一种执行方法的方法,而无需在编译时准确地知道这些方法是什么