为什么这个方法不需要参数?
Why doesn't this method need a parameter?
我正在为一家公司做论文项目,但我在理解某些代码时遇到了一些困难。
在他们的代码中有这样一行
_subscriber.StartSubscribing(_messageHandler.HandleMessage);
其中 _subscriber
是定义的函数
public override void StartSubscribing(Action<QueueItem> messageHandlerMethod);
并且_messageHandler
定义
public void HandleMessage(QueueItem message)
{
//Do code here
}
为什么顶部的 messageHandler 不需要 HandleMessage 的参数?
E.I
_subscriber.StartSubscribing(_messageHandler.HandleMessage(QueueItem));
对于 _subscriber.StartSubscribing(_messageHandler.HandleMessage)
,您使用的是更直接的方式 _subscriber.StartSubscribing(msg => _messageHandler.HandleMessage(msg))
。
所以它确实需要一个参数。
因为您实际上并没有执行方法 HandleMessage
(如果您有括号和参数,就会发生这种情况)。您将它作为对 StartSubscribing
的引用传递,它需要一个具有指定签名的方法(void return,一个 QueueItem
类型的参数)
Action<T>
是一个通用委托,此特定版本是一个委托,它指定没有 return(无效)和类型为 T
(或 QueueItem
的单个参数在你的例子中)
事实上,它是方法 StartSubscribing
(或者它所属的 class)可能提供 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);
}
我正在为一家公司做论文项目,但我在理解某些代码时遇到了一些困难。
在他们的代码中有这样一行
_subscriber.StartSubscribing(_messageHandler.HandleMessage);
其中 _subscriber
是定义的函数
public override void StartSubscribing(Action<QueueItem> messageHandlerMethod);
并且_messageHandler
定义
public void HandleMessage(QueueItem message)
{
//Do code here
}
为什么顶部的 messageHandler 不需要 HandleMessage 的参数?
E.I
_subscriber.StartSubscribing(_messageHandler.HandleMessage(QueueItem));
对于 _subscriber.StartSubscribing(_messageHandler.HandleMessage)
,您使用的是更直接的方式 _subscriber.StartSubscribing(msg => _messageHandler.HandleMessage(msg))
。
所以它确实需要一个参数。
因为您实际上并没有执行方法 HandleMessage
(如果您有括号和参数,就会发生这种情况)。您将它作为对 StartSubscribing
的引用传递,它需要一个具有指定签名的方法(void return,一个 QueueItem
类型的参数)
Action<T>
是一个通用委托,此特定版本是一个委托,它指定没有 return(无效)和类型为 T
(或 QueueItem
的单个参数在你的例子中)
事实上,它是方法 StartSubscribing
(或者它所属的 class)可能提供 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);
}