2016-09-14 2 views
1

В чем заключается использование незарегистрированного обработчика событий, который еще не добавлен в код ниже?Какой смысл использовать EventHandler?

public class foo 
{ 
    private event EventHandler<boo> booCompleted; 

    public RegisterBooCompletedHandler(EventHandler<boo> newBooCompletedEventHandler, bool forceUnregisterOtherEventHandlers) 
    { 
     if (forceUnregisterOtherEventHandlers) 
      booCompleted = null 

     booCompleted -= newBooCompletedEventHandler;  // <- why do we unregister not added yet event handler? 
     booCompleted += newBooCompletedEventHandler; 
    } 
} 
+0

Это, вероятно, чтобы убедиться, что нет ранее существовавшая обработчик события, связанные с этим событием, прежде чем добавить один, или в этом случае, убедитесь, что booCompleted не существующую ссылку на newBooCompletedEventHandler. (Происходит, если RegisterBooCompletedHandler каким-то образом вызывается дважды по ошибке) –

ответ

4

Это означает, что если вы звоните RegisterBooCompletedHandler(handler) несколько раз с тем же обработчиком, вы на самом деле только подписаться на событие раз для этого обработчика.

Мое предположение, что фактически вы видели это из-за того, что кто-то работает вокруг проблемы, когда они действительно подписались на мероприятие в неположенном месте и поэтому подписались несколько раз ... но я уверен, что там некоторые случаи, когда трудно узнать, подписаны вы или нет, и просто сделать это (почти) no-op для подписки снова удобно.

Я говорю, что это «(почти) no-op», потому что он меняет порядок. Рассмотрим:

// After this call, invocation list is A 
RegisterBooCompletedHandler(A, false); 
// After this call, invocation list is A, B 
RegisterBooCompletedHandler(B, false); 
// After this call, invocation list is A, B, C 
RegisterBooCompletedHandler(C, false); 
// After this call, invocation list is A, C, B 
RegisterBooCompletedHandler(B, false);