为什么这个方法不需要参数?

时间:2016-12-20 13:30:03

标签: c# delegates action

我正在为一家公司的论文工作项目工作,而且我在理解某些代码方面遇到了一些困难。

在他们的代码中,他们有这样的一行

_subscriber.StartSubscribing(_messageHandler.HandleMessage);

其中_subscriber是函数定义

public override void StartSubscribing(Action<QueueItem> messageHandlerMethod);

_messageHandler已定义

public void HandleMessage(QueueItem message)
{
  //Do code here
}

如何在消息处理程序的顶部不需要HandleMessage的参数?

E.I

_subscriber.StartSubscribing(_messageHandler.HandleMessage(QueueItem));

2 个答案:

答案 0 :(得分:5)

因为你实际上并没有执行方法HandleMessage(如果你有括号和参数会发生这种情况)。您将它作为对StartSubscribing的引用传递,它期望具有指定签名的方法(void返回,类型为QueueItem的一个参数)

Action<T>是一个通用委托,这个特定版本是一个委托,它不指定返回(void)和一个类型为T的单个参数(或者示例中为QueueItem

事实上,方法StartSubscribing(或者它所属的类)很可能提供QueueItem的实例 - 可能是这样的:

public override void StartSubscribing(Action<QueueItem> messageHandlerMethod)
{
    // do something to get/create a QueueItem
    QueueItem item = SomeMagic();

   // pass it back to the passed in delegate
   messageHandlerMethod(item);   
}

答案 1 :(得分:2)

使用_subscriber.StartSubscribing(_messageHandler.HandleMessage),您可以更直接地使用_subscriber.StartSubscribing(msg => _messageHandler.HandleMessage(msg))

所以它需要一个参数。