В чем разница между типом делегата и типом обработчика событий? - PullRequest
6 голосов
/ 07 сентября 2011

Три связанных идиома: событие, делегат, обработчик события.Меня всегда смущает, кто "добавлен" к кому.

event += handler
event += delegate
handler += delegate

Из того, что я знаю:

  • делегат: указатель на функцию с известной подписью.
  • обработчик события: делегат, зарегистрированный на событие.По сути, это то же самое, что делегат?
  • событие: список делегатов \ обработчиков событий, которые выполняются, когда событие вызывается с использованием event ()

Что меня смущаетбольше эта подпись в MSDN:

public delegate void EventHandler(Object sender, EventArgs e)

Ответы [ 3 ]

4 голосов
/ 07 сентября 2011

«Событие» - это просто ярлык для двух методов, которые работают с делегатом - добавление и удаление методов доступа . По умолчанию компилятор создает делегат за событием (если вы не пишете свои собственные методы доступа).

Когда вы звоните someEvent += aDelegate;, вы вызываете аксессор события add. Обычно это переводится компилятором в вызов delegate += для делегата с той же сигнатурой, что и у события, - аналогично тому, как автоматические свойства автоматически сопоставляются с вспомогательным полем. Вот почему событие кажется таким похожим на делегата.

что меня больше смущает, так это подпись в MSDN: открытый делегат void EventHandler (Отправитель объекта, EventArgs e)

Эта подпись является просто подписью делегата. Технически, событие может использовать любой делегат. Однако, по соглашению, он всегда будет принимать два параметра: первый - это «отправитель», вызвавший событие, второй - класс, производный от EventArgs (например, EventHandler и EventHandler<T>).

3 голосов
/ 07 сентября 2011

К событию добавляется delegate, который «указывает» на обработчик.

Таким образом, в основном, когда поднимается event, будет вызываться коллекция делегатов, которая у него есть, чтов результате вызовут обработчики, связанные с этими делегатами.

//declare delegate
public delegate void EventHandler(  Object sender,  EventArgs e)

//create event based on delegate
public event EventHandler evHandler;

//function to attach to handler
public static void Handler(object sender, EventArgs e) {}

attach eventhandler function through delegate to event.
event += new EventHandler(Handler);
0 голосов
/ 08 сентября 2011

Вот мое резюме (пожалуйста, поправьте меня, если я ошибаюсь):

  • delegate - указатель на метод (экземпляр \ статический)

  • eventHandler - делегат с определенной подписью (отправитель, eventArgs)

  • event - это абстракция доступа к делегату любого типа, но обычно это eventHandler по соглашению

    //We declare delegates as a new type outside of any class scope (can be also inside?)
    
        public delegate retType TypeName (params...)
    
    //Here we assign
    
        public TypeName concreteDeleagteName = new TypeName (specificMethodName);
    
    //Declaring event
    //a. taken from /1622033/yavnoe-sobytie-dobavit-udalit-nepravilno-ponyal
    
    private EventHandler _explicitEvent;
    public event EventHandler ExplicitEvent
    {
       add
       {
           if (_explicitEvent == null) timer.Start();
           _explicitEvent += value;
       }
       remove
       {
          _explicitEvent -= value;
          if (_explicitEvent == null) timer.Stop();
       }
    }
    
    //or: b.auto event - the compiler creates a "hidden" delegate which is bounded to this event
          public event TypeName eventName;
    

Хочу порекомендовать отличную статью Обработка событий в .NET с использованием C # .

Таким образом, мы можем только прикрепить (eventName):

eventName += new TypeName (specificMethodName);

Что эквивалентно (_eventName является делегатом \ eventHandler):

_eventName += new TypeName (specificMethodName);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...