Предыдущие записи:
Подпись события в .NET - Использование строго отправленного типа «Отправитель»?
Почему в обработчике событий C # параметр «отправитель» должен быть объектом?
Соглашения и руководства Microsoft заставляют пользователей .NET использовать специальные шаблоны для создания, создания и обработки событий в .NET.
Руководство по разработке событий http://msdn.microsoft.com/en-us/library/ms229011.aspx утверждает, что
Образец цитирования:
Подпись обработчика событий соблюдает следующие соглашения:
Тип возврата Void.
Первый параметр называется отправителем
и имеет тип Object. Это
объект, вызвавший событие.
Второй параметр называется e и
имеет тип EventArgs или производный
класс EventArgs. Это
специфичные для события данные.
Метод занимает ровно два
параметры.
Эти соглашения говорят разработчикам, что (следующий) более короткий и очевидный код является злом:
public delegate void ConnectionEventHandler(Server sender, Connection connection);
public partial class Server
{
protected virtual void OnClientConnected(Connection connection)
{
if (ClientConnected != null) ClientConnected(this, connection);
}
public event ConnectionEventHandler ClientConnected;
}
и (следующий) более длинный и менее очевидный код - это хорошо:
public delegate void ConnectionEventHandler(object sender, ConnectionEventArgs e);
public class ConnectionEventArgs : EventArgs
{
public Connection Connection { get; private set; }
public ConnectionEventArgs(Connection connection)
{
this.Connection = connection;
}
}
public partial class Server
{
protected virtual void OnClientConnected(Connection connection)
{
if (ClientConnected != null) ClientConnected(this, new ConnectionEventArgs(connection));
}
public event ConnectionEventHandler ClientConnected;
}
Хотя в этих рекомендациях не указано, почему так важно следовать этим соглашениям, разработчики ведут себя как обезьяны, которые не знают, почему и что они делают.
ИМХО, соглашения Microsoft о подписи событий для .NET вредны для вашего кода, потому что они требуют дополнительных усилий с нулевой эффективностью для кодирования, кодирования, кодирования:
- Кодирование «(MyObject) sender» приводит (не говоря уже о 99% ситуаций, которые вообще не требуют отправителя)
- Кодирование производного «MyEventArgs» для данных, передаваемых в обработчик событий.
- Кодирование разыменования (вызов «e.MyData», когда требуются данные, а не просто «данные»)
Это не так сложно сделать, но практически говорить о том, что мы теряем, когда не соблюдаем соглашения Microsoft, за исключением того, что люди воспринимают вас как еретика, потому что ваш акт противостояния соглашениям Microsoft граничит с богохульством :)
Согласны ли вы?