2009-04-15 1 views
0


Pourquoi les classes dérivées devraient-elles gérer un événement sans attacher un délégué?

Q1:

« La méthode ListControl.OnSelectedIndexChanged permet également aux classes dérivées à gérer l'événement sans y attacher un délégué. Ceci est la technique préférée pour gérer l'événement dans une classe dérivée. »


A) Si je comprends la citation ci-dessus, si nous tirons une classe de ListControl, nous devrions au lieu de souscrire à l'événement SelectedIndexChanged , traiter procédé OnSelectedIndexChanged() en tant que gestionnaire d'événement et de mettre ainsi une logique de traitement d'événement à l'intérieur:

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

Pourquoi serait-ce mieux que l'abonnement à un événement (à l'intérieur .aspx) via OnSelectedIndexChanged = « name_of_event_handler »?


B) Quoi qu'il en soit, dans le fichier ascx nous utilisons l'attribut OnSelectedIndexChanged pour attacher gestionnaire d'événements à un événement. Le nom de cet attribut est le même que le nom de la méthode OnSelectedIndexChanged(). Pourquoi donc? Pourquoi ne pas plutôt le nom de cet attribut SelectedIndexChanged:

<asp:ListControl SelectedIndexChanged = ”name_of_event_handler” 

Après tout, l'attribut fait référence à un événement et non à une méthode (OnSelectedIndexChanged()) qui appelle cet événement!


Thanx


EDIT:

Bonjour,

Cependant, soyez sûr que vous appelez base.On [EventName] ou événement gagné t le feu!

En supposant que vous ne voulez pas que quelqu'un d'autre pour être en mesure de répondre à cet événement, alors serait-il tout à fait correct de ne pas appeler base.On [EventName], puisque je ne pense pas appeler ne sera pas vraiment faire du mal en plus de ne pas déclencher un événement (et donc les gestionnaires d'événements ne seront pas appelés)?

Je réalise que certains événements doivent être déclenchés pour que Framework puisse faire son travail, mais qu'en est-il de ne pas appeler base.On [SelectedIndexChanged]?

Répondre

1

En général, je préfère remplacer les fonctions On [EventName] afin que je puisse contrôler si ma logique se produit avant ou après la logique dans les abonnés. Cependant, assurez-vous que vous appelez base.On [EventName] sinon l'événement ne se déclenchera pas!

4

Il est « meilleur » en ce que:

  • il est moins cher d'utiliser virtual (héritage) lorsque cela est possible - il élimine la nécessité de quelques objets supplémentaires (instances de délégué, etc.)
  • il permet le code prioritaire pour savoir où il se trouve dans la séquence - c.-à-d. si plusieurs appelants écoutent, est-ce le premier tireur? seconde? au milieu?

Le premier point est sans doute plus important pour l'efficacité, en particulier dans des choses comme des contrôles qui ont des gestionnaires d'événements rares (à savoir des choses comme EventHandlerList au lieu d'un champ comme événement).

Je ne comprends pas vraiment la deuxième question, mais à la conjecture: la convention.