Ответ 1
Просто случайность истории. Если бы у нас были генерики в .NET 1, большинство других делегатов не существовало бы.
.NET 2.0 добавил тип делегата EventHandler<TArgs>
для упрощения процесса создания пользовательских событий; вместо того, чтобы определять класс EventArgs
и соответствующий ему делегат (например, MyEventArgs
и MyEventHandler
), вам нужно написать только класс args.
Помня об этом, почему этот тип делегата почти не встречается в .NET Framework? Я знаю, что большинство основных API-интерфейсов были разработаны до того, как появились дженерики, но даже в новых частях структуры, таких как WPF, они решили явно определять типы делегатов; например RoutedEventHandler
вместо EventHandler<RoutedEventArgs>
.
Есть ли что-то по своей сути неправильно с делегатом обработчика генерических событий? Я часто использую его, и я беспокоюсь, что мой код выглядит очень неуместным по сравнению со встроенными классами.
Просто случайность истории. Если бы у нас были генерики в .NET 1, большинство других делегатов не существовало бы.
Я не думаю, что с этим что-то не так. Он используется в некоторых местах рамки... в событии GeoCoordinateWatcher.Position
, как случайный пример.
Немного неудобно видеть в коде, чем конкретное имя типа, например RoutedEventHandler
- и поскольку вы собираетесь использовать RoutedEventHandler
много в WPF/Silverlight, возможно, поэтому MS решила дать ему свой собственный тип.
Также может быть, когда вы пишете код уровня фреймворка, вы, как правило, более явны. Когда вы пишете инструментарий и код уровня приложения не так.
Следующее - это только мой личный поворот, но для меня это кажется (очевидно) разумным;
Если мы внимательно рассмотрим, как вы работаете с использованием .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 - для вашего примера о маршрутизируемом событии правило может сказать, что его тип "помечен" как исходящий из-за того, что его имя устарело со словом "Маршрутизировано". Хотя именование этого события само по себе говорит, что имя начинается с "предварительного просмотра".
Как я уже упоминал: это просто мое мнение, поэтому не обвиняйте меня;)