Почему универсальный EventHandler <TArgs>так мало используется? - PullRequest
11 голосов
/ 12 ноября 2010

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

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

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

Ответы [ 4 ]

7 голосов
/ 12 ноября 2010

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

5 голосов
/ 12 ноября 2010

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

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

2 голосов
/ 12 ноября 2010

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

1 голос
/ 12 ноября 2010

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

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

Хотя приведенный выше код довольно прост, прямо вперед и хорошо поддерживается интеллигентским чувством, «внешний вид и поведение» EventHandler не кажется таким ясным.По умолчанию поддержка Intelli предложит только EventHandler, а не его универсальный.Кроме того, нотация выглядит просто замечательно:

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



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

С другой стороны также может быть менее изотерическое и более техническое / логическое объяснение:
Прежде всего вы всегда получаете объект-отправитель в методе обработки.Хотя это кажется на первый взгляд полезным - это когда-либо использовавшийся ячмень.
Кроме того, ваши аргументы должны исходить из EventArgs, который может быть раздражающим, а иногда даже просто невозможным из-за использования существующих компонентов.
За исключением типичныхОбобщенные (например, IList / List) вы теряете возможность использовать более абстрактный тип (например, интерфейс) или просто простой тип (например, double).
И последнее, но не менее важное - есть те правила / предложения обозначений, которые были введены Microsoft- для вашего примера о перенаправленном событии правило может сказать, что его тип «помечен» как маршрутизируемый, если его имя помечено словом «Routed».В то время как само название события говорит о том, что название начинается с «Предварительного просмотра».

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...