В чем разница между типом делегата и типом eventhandler?

три связанных идиомы: событие, делегат, обработчик событий. Я всегда путаюсь, кто к кому" добавляется".

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

из того что я знаю:

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

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

public delegate void EventHandler(Object sender, EventArgs e)

3 ответов


"событие" - это просто ярлык для двух методов, которые работают с делегатом - в Add и remove. Компилятор по умолчанию делает делегат за событием (если вы не пишете свои собственные методы доступа).

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

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

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


событие 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);

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

  • delegate является указателем на метод (экземпляр\static)

  • 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 http://stackoverflow.com/questions/2923952/explicit-event-add-remove-misunderstood
    
    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);