Почему общий EventHandler <TArgs> настолько не используется?

.NET 2.0 добавил тип делегата EventHandler<TArgs> для упрощения процесса создания пользовательских событий; вместо того, чтобы определять класс EventArgs и соответствующий ему делегат (например, MyEventArgs и MyEventHandler), вам нужно написать только класс args.

Помня об этом, почему этот тип делегата почти не встречается в .NET Framework? Я знаю, что большинство основных API-интерфейсов были разработаны до того, как появились дженерики, но даже в новых частях структуры, таких как WPF, они решили явно определять типы делегатов; например RoutedEventHandler вместо EventHandler<RoutedEventArgs>.

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

Ответ 1

Просто случайность истории. Если бы у нас были генерики в .NET 1, большинство других делегатов не существовало бы.

Ответ 2

Я не думаю, что с этим что-то не так. Он используется в некоторых местах рамки... в событии GeoCoordinateWatcher.Position, как случайный пример.

Немного неудобно видеть в коде, чем конкретное имя типа, например RoutedEventHandler - и поскольку вы собираетесь использовать RoutedEventHandler много в WPF/Silverlight, возможно, поэтому MS решила дать ему свой собственный тип.

Ответ 3

Также может быть, когда вы пишете код уровня фреймворка, вы, как правило, более явны. Когда вы пишете инструментарий и код уровня приложения не так.

Ответ 4

Следующее - это только мой личный поворот, но для меня это кажется (очевидно) разумным; Если мы внимательно рассмотрим, как вы работаете с использованием .net и v studio, кажется, что типичная нотация типа, кажется, теряет некоторую "красоту".

List<string> lst = new List<string>();
lst.Add("hello world");

В то время как вышеприведенный код довольно прост, прямо и хорошо поддерживается intelli, ощущение, что "Look and feel" EventHandler не отображается, что ясно. Поддержка intelli по умолчанию предложит только EventHandler, а не его общий. Кроме того, нотация выглядит просто:

private event EventHandler<MyClass> SomeEvent;
private event EventHandler<AnotehrClass> OtherEvent;
privete event EventHandler<MoreClass> MoreEvents;



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

С другой стороны, может быть и менее изологическое и более техническое/логическое объяснение:
Прежде всего, вы всегда получаете объект-отправитель в методе обработки. Хотя это кажется полезным на первый взгляд - это ячмень, когда-либо используемый.
Далее ваши аргументы должны быть получены из EventArgs, которые могут быть раздражающими, а иногда даже просто невозможными из-за использования существующих компонентов.
Помимо типичных дженериков (например, IList/List), вы получаете возможность использовать более абстрактный тип (например, интерфейс) или просто простой тип (например, двойной).
Наконец, но не в последнюю очередь есть те правила/предложения о нотации, внесенные microsoft - для вашего примера о маршрутизируемом событии правило может сказать, что его тип "помечен" как исходящий из-за того, что его имя устарело со словом "Маршрутизировано". Хотя именование этого события само по себе говорит, что имя начинается с "предварительного просмотра".

Как я уже упоминал: это просто мое мнение, поэтому не обвиняйте меня;)