我正在为一家公司的论文工作项目工作,而且我在理解某些代码方面遇到了一些困难。
在他们的代码中,他们有这样的一行
_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));
答案 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))
。
所以它需要一个参数。