Это позволяет разработчику потребления способность записать единственный обработчик событий для нескольких событий, независимо от отправителя или события.
Редактирование: , Почему Вам был бы нужен различный шаблон? Можно наследовать EventArgs для обеспечения любого объема данных, и изменение шаблона только собирается служить, чтобы смутить и расстроить любого разработчика, который вынужден использовать этот новый шаблон.
Поскольку это - хороший шаблон для любого механизма обратного вызова, независимо от языка. Вы хотите знать, кто отправил событие (отправитель) и данные, которые являются подходящими для события (EventArgs).
Это - хороший шаблон для использования, тот путь, что когда-либо реализует событие, может найти то, что отправляло его.
Также переопределение EventArgs и передающих данных через них является лучшим методом. EventArgs являются базовым классом. Если Вы смотрите на различные средства управления, что события вызова, они переопределили EventArgs, который дает Вам больше информации о событии.
, Даже если Вам не нужны аргументы, чтобы сделать событие, если Вы не включаете их с первым показом платформы и хотите добавить их позже, Вы повреждаете все предыдущие реализации и имеете для переписывания их. Плюс то, если Вы создание платформы и попытка распределить это это становится хуже, потому что все, которые используют Вашу платформу, должны будут осуществить рефакторинг.
Казалось, что это было способом Microsoft развивать модель событий со временем. Также кажется, что они также позволяют другому способу сделать это с "новым" делегатом Действия, и это - изменения.
На самом деле это спорно, является ли это лучшей практикой способ сделать события. Существует философская школа, что, поскольку события предназначаются для разъединения двух сегментов кода, то, что обработчик событий получает отправителя, и должен знать, какой тип бросить отправителя в то, чтобы сделать что-либо с ним, антишаблон.
Используя единственный параметр, EventArgs, для данных, переданных событием, позволяет Вам добавлять данные к своему событию в будущих версиях Вашего программного обеспечения, не повреждая существующих потребителей. Вы просто добавляете новых участников к существующему EventArgs-производному-классу или создаете производный класс с новыми участниками.
Иначе непротиворечивость и принцип наименьшего количества удивления выравнивают по ширине использование EventArgs для передающих данных.
Что касается отправителя, в некоторых (но не все) случаи полезно знать то, что тип отправил событию. Используя тип кроме объекта для отправителя аргумент слишком строг: это означало бы, что другие отправители не могли снова использовать ту же подпись события.
Chris Anderson говорит в книге Руководства по проектированию Платформы:
[T] его примерно шаблон. Путем упаковки аргументов события в классе Вы получаете лучшую семантику управления версиями. При наличии общего шаблона
(sender, e)
это легко изучено как подпись для всех событий.
существуют ситуации, главным образом включающие interop, который потребовал бы отклонения от этого шаблона.
Иногда вам нужно заставить всех ваших потребителей событий использовать определенный параметр события, например, событие безопасности, которое передает логический параметр, истинно для хорошего, ложно для плохого. В этом случае вы хотите, чтобы ваш потребитель был болезненно осведомлен о новом параметре, т.е. вы хотите, чтобы ваши потребители были связаны с этим параметром. Обратите внимание, ваши потребители по-прежнему отделены от вашего класса активации события, но не от вашего события.
Я подозреваю, что этот сценарий применим к большому количеству случаев, и в этих случаях значение EventArgs значительно снижается.