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

Boj*_*jje 0 c# delegates action

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

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

_subscriber.StartSubscribing(_messageHandler.HandleMessage);
Run Code Online (Sandbox Code Playgroud)

_subscriber函数在哪里定义

public override void StartSubscribing(Action<QueueItem> messageHandlerMethod);
Run Code Online (Sandbox Code Playgroud)

_messageHandler定义

public void HandleMessage(QueueItem message)
{
  //Do code here
}
Run Code Online (Sandbox Code Playgroud)

为什么在messageHandler顶部不需要HandleMessage的参数?

EI

_subscriber.StartSubscribing(_messageHandler.HandleMessage(QueueItem));
Run Code Online (Sandbox Code Playgroud)

Jam*_*iec 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);   
}
Run Code Online (Sandbox Code Playgroud)

  • 事实上,这个答案比亨氏更为正确. (2认同)