В чем разница между типом делегата и типом 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);