Почему в обработчике событий C # параметр «отправитель» должен быть объектом? - PullRequest
69 голосов
/ 17 сентября 2009

Согласно Руководству по именованию событий Microsoft , параметр sender в обработчике событий C # " всегда объекта типа, даже если возможно использовать более конкретный тип ».

Это приводит к большому количеству кода обработки событий, например:

RepeaterItem item = sender as RepeaterItem;
if (item != null) { /* Do some stuff */ }

Почему конвенция не рекомендует объявлять обработчик событий с более конкретным типом?

MyType
{
    public event MyEventHander MyEvent;
}

...

delegate void MyEventHander(MyType sender, MyEventArgs e);

Я скучаю по Гоче?

Для потомков: я согласен с общим мнением в ответах, что соглашение - это для использования объекта (и для передачи данных через EventArgs), даже когда возможно использование более конкретного типа, и в программирование в реальном мире важно для соблюдения соглашения.

Ответы [ 12 ]

0 голосов
/ 17 сентября 2009

Я склонен использовать определенный тип делегата для каждого события (или небольшую группу похожих событий). Бесполезный отправитель и eventargs просто загромождают API и отвлекают от актуальных битов информации. Возможность «пересылать» события между классами не является чем-то, что я пока не нашел полезным - и если вы пересылаете такие события в обработчик событий, представляющий событие другого типа, то вынуждены переносить событие Вы сами и предоставите соответствующие параметры без особых усилий. Кроме того, экспедитор имеет тенденцию иметь лучшее представление о том, как «преобразовать» параметры события, чем конечный получатель.

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

0 голосов
/ 17 сентября 2009

Ну, это хороший вопрос. Я думаю, потому что любой другой тип мог бы использовать ваш делегат для объявления события, поэтому вы не можете быть уверены, что тип отправителя действительно «MyType».

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