Является ли передача EventArg вокруг обработчиков событий потенциально опасной?

Я вызываю обработчик событий из другого:

private void launchApplicationToolStripMenuItem_Click(object sender, EventArgs e) {
            listApplications_DoubleClick(listApplications, null); 
        }

        private void listApplications_DoubleClick(object sender, EventArgs e) {

«listApplications» — это ListView.

Мне пришлось передать listApplications, потому что я передал отправителя в событии DoubleClick() в ListView.

А как насчет второго аргумента? Должен ли я передать null, как показано выше, или я должен передать «e» следующим образом:

listApplications_DoubleClick(listApplications, e);

Оба способа работают нормально/одинаково при хороших обстоятельствах. Я не знаю, было бы это так, если бы было исключение, хотя...


person B. Clay Shannon    schedule 12.04.2012    source источник
comment
Могу ли я предложить вместо этого создать третий метод, имя которого описывает то, что фактически произойдет, а затем каждый из ваших обработчиков событий будет вызывать его? Это сделает код более понятным.   -  person Platinum Azure    schedule 12.04.2012


Ответы (3)


Ну, я бы не сказал, что это опасно, но это может вызвать некоторые проблемы, такие как исключения, если они не обрабатываются должным образом. В вашем примере одно событие представляет собой событие щелчка, а другое — событие двойного щелчка, что означает, что оба объекта EventArgs, e, фактически являются MouseEventArgs. Это хорошо, потому что тогда вам не нужно беспокоиться о том, что второй обработчик событий получит доступ к несуществующим членам e.

Теперь давайте предположим, что вы хотите вызывать событие рисования, например, всякий раз, когда пользователь нажимает кнопку. В этом случае событие click вызовет событие рисования. Теперь проблема в следующем: событие рисования ожидает PaintEventArgs, поэтому передача MouseEventArgs может вызвать исключение. Конечно, если вы контролируете обе части кода, вы можете сами проверить, будет ли какой-либо доступ к конкретному члену PaintEventArgs. Если нет, то все в порядке, хотя я все равно не вижу смысла передавать аргументы в этом сценарии.

Надеюсь, это не было слишком запутанно.

person Itzack    schedule 12.04.2012

Нет, передача EventArg не опасна до тех пор, пока вы не используете тело метода ein listApplications_DoubleClick (отправитель объекта, EventArgs e).

person TAhmad    schedule 12.04.2012

Когда вы вызываете обработчик идентичного события (т. е. когда вы вызываете событие двойного щелчка из другого события двойного щелчка), вы должны передать ему аргументы события. Аргументы события содержат важную информацию о двойном клике, например, его местоположение. Если обработчик «вниз по цепочке» не заботится об этих аргументах, передача null не вызовет проблем; однако вы не должны предполагать, что вызываемый вами обработчик игнорирует аргумент и передает ему что-то допустимое.

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

person Sergey Kalinichenko    schedule 12.04.2012