Я понимаю преимущества событий с помощью типов делегата с подписью delegate void delegate_name(object sender, EventArgs e)
a) Но помимо того, что это может сохранить нас некоторый ввод, там любые другие причины, почему мы уже должны использовать определенные типы делегата EventHandler/EventHandler<T>
вместо того, чтобы объявить нашего собственного делегата вводит с подписью delegate void delegate_name(object sender, EventArgs e)
?
b) Две других причины я могу думать для использования предопределенных типов делегата EventArgs/EventArgs<T>
:
люди, использующие конкретное событие (говорят event EventHandler my_event
) будет сразу знать, как использовать то событие?
возможно, некоторые популярные сторонние методы принимают как параметры EventHandler/ EventHandler<T>
делегируйте типы, и таким образом если существует шанс, что наш код может использовать те сторонние методы, мы должны использовать предопределенных делегатов EventHandler/Eventhandler<T>
?
спасибо
Для меня вопрос немного странный. В чем заключалась бы польза от этого в противном случае (определение типов делегатов, которые точно соответствуют EventHandler
для некоторых TEventArgs
)?
Тем не менее, существует как минимум одно преимущество, которое я могу придумать, чтобы сделать это «нормальным» способом: некоторые API уже рассчитывают иметь дело с делегатами EventHandler
; например, Rx Extensions включает метод, который выглядит следующим образом:
Observable.FromEvent<TEventArgs>(
Action<EventHandler<TEventArgs>> addHandler,
Action<EventHandler<TEventArgs>> removeHandler
);
Если вы определили свой собственный делегат, используя такие методы, которые ожидают делегатов EventHandler
- станет более сложным, чем необходимо, без дополнительных преимуществ (во всяком случае, это я вижу).
Из Pro C# 2008 и платформа .NET 3.5:
Когда компилятор обрабатывает ключевое слово event, вам автоматически предоставляются методы регистрации и снятия с регистрации*, а также все необходимые члены переменные** для ваших типов делегатов. ...Конечно, ключевое слово event является не более чем синтаксический сахар, поскольку оно просто экономит время набора текста.
* Это включает в себя перегрузку удобных операторов +=
и -=
.
** ...которые уже помечены private
, так что их нельзя перегрузить.
Когда вы используете общий делегат EventHandler, вам вообще не нужно писать свой собственный тип делегата.
Вы забыли одну важную вещь:
Вы ответили на свой вопрос:
EventHandler
позволяет легко интегрировать события из других библиотек ] Короче говоря, нет веских причин не использовать его, если только вы не вынуждены (что обычно является результатом того, что люди не знают об этом или не понимают его).