Преимущества событий с помощью EventArgs/EventArgs <T> делегируют типы вместо …

Я понимаю преимущества событий с помощью типов делегата с подписью 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>?

спасибо

5
задан flockofcode 29 June 2010 в 19:01
поделиться

4 ответа

Для меня вопрос немного странный. В чем заключалась бы польза от этого в противном случае (определение типов делегатов, которые точно соответствуют EventHandler для некоторых TEventArgs )?

Тем не менее, существует как минимум одно преимущество, которое я могу придумать, чтобы сделать это «нормальным» способом: некоторые API уже рассчитывают иметь дело с делегатами EventHandler ; например, Rx Extensions включает метод, который выглядит следующим образом:

Observable.FromEvent<TEventArgs>(
    Action<EventHandler<TEventArgs>> addHandler,
    Action<EventHandler<TEventArgs>> removeHandler
);

Если вы определили свой собственный делегат, используя такие методы, которые ожидают делегатов EventHandler - станет более сложным, чем необходимо, без дополнительных преимуществ (во всяком случае, это я вижу).

11
ответ дан 18 December 2019 в 06:02
поделиться

Из Pro C# 2008 и платформа .NET 3.5:

Когда компилятор обрабатывает ключевое слово event, вам автоматически предоставляются методы регистрации и снятия с регистрации*, а также все необходимые члены переменные** для ваших типов делегатов. ...Конечно, ключевое слово event является не более чем синтаксический сахар, поскольку оно просто экономит время набора текста.

* Это включает в себя перегрузку удобных операторов += и -=.

** ...которые уже помечены private, так что их нельзя перегрузить.

Когда вы используете общий делегат EventHandler, вам вообще не нужно писать свой собственный тип делегата.

2
ответ дан 18 December 2019 в 06:02
поделиться

Вы забыли одну важную вещь:

  • сумасшедший, который когда-нибудь будет поддерживать ваш код, узнает, где вы живете, и причинит вам боль.
7
ответ дан 18 December 2019 в 06:02
поделиться

Вы ответили на свой вопрос:

  • Syntactical Sugar (меньше писать) для поддержания соглашения
  • Взаимодействие (использование типа EventHandler позволяет легко интегрировать события из других библиотек

] Короче говоря, нет веских причин не использовать его, если только вы не вынуждены (что обычно является результатом того, что люди не знают об этом или не понимают его).

5
ответ дан 18 December 2019 в 06:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: