2016-12-20 23 views
0

私は会社の論文作成プロジェクトのプロジェクトに取り組んでいますが、いくつかのコードを理解するのが難しいです。そのコードではなぜこのメソッドはパラメータを必要としませんか?

彼らは_subscriberは機能が

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

そして_messageHandlerを定義されている。この

_subscriber.StartSubscribing(_messageHandler.HandleMessage); 

のような行が先頭に来るどのように

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

が定義されていmessageHandlerはHandleMessageのパラメータを必要としませんか? _subscriber.StartSubscribing(_messageHandler.HandleMessage)

E.I

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

答えて

2

あなたは_subscriber.StartSubscribing(msg => _messageHandler.HandleMessage(msg))のためのより直接的な方法を使用しています。

したがって、パラメータが必要です。

+0

いいえ、実際には構文的な砂糖はありません。それはそれです:メソッドは、特定の署名の代理人を期待しています。あなたはそれを提供する。ラムダは構文糖です。 –

+0

@PatrickHofmanあなたは正しいです。訂正してくれてありがとう、私は答えを修正した。 – Nico

5

実際にはHandleMessageというメソッドを実行していないため(括弧とパラメータがある場合に発生します)あなたは

は、ジェネリックデリゲート、この特定のバージョンは、ノーリターン(無効)を指定していないデリゲートですAction<T>

指定された署名(voidを返す、タイプ QueueItemの一つのパラメータ)でメソッドを期待 StartSubscribingへの参照としてそれを渡していますそして、(あなたの例でまたは QueueItem)タイプ Tの単一のパラメータ

に実際には、それはQueueItemのインスタンスを提供する可能性がある方法StartSubscribing(またはおそらくそれが属するクラス)である - おそらくこのような何か:

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); 
} 
+2

この回答は実際にはハインツのそれよりも正確です。 –

+0

ええ、「StartSubscribing」が何を期待しているかをもっと深く説明しています。しかし、 'HandlerMessage'に' QueueItem'型のパラメータを期待して与える必要がない理由をもっと理解したかったのです。 – Bojje

+0

@Bojje更新を参照してください。 – Jamiec