Почему производные классы должны обрабатывать событие, не подключая делегат? - PullRequest
0 голосов
/ 15 апреля 2009


1:

«Метод ListControl.OnSelectedIndexChanged также позволяет производным классам обрабатывать событие, не подключая делегат. Это предпочтительный метод для обработки события в производном классе. ”


A) Если я понимаю приведенную выше цитату, тогда, если мы извлекаем класс из ListControl, мы должны вместо подписки на событие SelectedIndexChanged рассматривать метод OnSelectedIndexChanged () как обработчик событий и таким образом помещать в него любую логику обработки событий:

protected override void OnSelectedIndexChanged(
EventArgs e
{
   //event handling logic
}

Почему это было бы лучше, чем подписка на событие (внутри .aspx) через OnSelectedIndexChanged = ”name_of_event_handler”?


В) В любом случае, в файле ascx мы используем атрибут OnSelectedIndexChanged, чтобы прикрепить обработчик события к событию. Имя этого атрибута совпадает с именем метода OnSelectedIndexChanged (). Это почему? Почему вместо этого нет имени этого атрибута SelectedIndexChanged:

 <asp:ListControl SelectedIndexChanged = ”name_of_event_handler”

В конце концов, атрибут относится к событию, а не к методу (OnSelectedIndexChanged ()), который вызывает это событие!


* 1023 спасибо *


EDIT:

Здравствуйте,

ОДНАКО, убедитесь, что вы вызываете base.On [EventName] или событие не сработает!

Предполагая, что вы не хотите, чтобы кто-то еще мог отвечать на это событие, тогда было бы нормально не вызывать base.On [EventName], так как я думаю, что не вызывая его, на самом деле не будет никакого вреда кроме того, чтобы не запускать событие (и, следовательно, обработчики событий не будут вызываться)?

Я понимаю, что некоторые события должны быть запущены для того, чтобы Framework выполнил свою работу, но как насчет не вызывать base.On [SelectedIndexChanged]?

Ответы [ 2 ]

4 голосов
/ 15 апреля 2009

"лучше" в этом:

  • дешевле использовать virtual (наследование), где это возможно - это устраняет необходимость в нескольких дополнительных объектах (экземплярах делегатов и т. Д.)
  • он позволяет переопределенному коду знать, где он находится в последовательности - то есть, если несколько абонентов прослушивают, запускается ли он первым? второй? в середине?

Первый пункт, возможно, более важен для эффективности, особенно в таких вещах, как элементы управления, которые имеют обработчики разреженных событий (то есть такие вещи, как EventHandlerList вместо поля как событие).

Я не совсем понимаю второй вопрос, но предположение: соглашение.

1 голос
/ 15 апреля 2009

В общем, я предпочитаю переопределять функции On [EventName], чтобы я мог контролировать, происходит ли моя логика до или после логики у любых подписчиков.

ОДНАКО, убедитесь, что вы вызываете base.On [EventName] или событие не сработает!

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