Appel de méthodes de base lors du remplacement d'événements au niveau de la page

StackOverflow https://stackoverflow.com/questions/19294

  •  09-06-2019
  •  | 
  •  

Question

Dans mon code derrière, je câble mes événements comme ceci :

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    btnUpdateUser.Click += btnUpateUserClick;
}

Je l'ai fait de cette façon parce que c'est ce que j'ai vu dans les exemples.

  • La méthode base.OnInit() doit-elle être appelée ?
  • Sera-t-il implicitement appelé ?
  • Vaut-il mieux l'appeler au début de la méthode ou à la fin ?
  • Quel serait un exemple où une confusion sur la méthode de base peut vous causer des ennuis ?
Était-ce utile?

La solution

Je devrais préciser :

Les directives recommandent que le déclenchement d'un événement implique l'appel d'un "On" virtuel.Nom de l'événement", mais ils disent aussi que si une classe dérivée remplace cette méthode et oublie d'appeler la méthode de base, l'événement devrait quand même se déclencher.

Voir la « Remarque importante » à mi-chemin cette page:

Les classes dérivées qui remplacent la méthode virtuelle protégée ne sont pas tenues d'appeler l'implémentation de la classe de base.La classe de base doit continuer à fonctionner correctement même si son implémentation n'est pas appelée.

Autres conseils

Dans ce cas, si vous n'appelez pas la base OnInit, alors Init ne se déclenchera même pas.

En général, il est recommandé de TOUJOURS appeler la méthode de base, sauf si vous savez spécifiquement que vous ne souhaitez pas que le comportement de base se produise.

Que cela soit appelé au début ou à la fin dépend de la façon dont vous voulez que les choses fonctionnent.Dans un cas comme celui-ci, où vous utilisez un remplacement au lieu de connecter un gestionnaire d'événements, l'appeler au début de la méthode est plus logique.De cette façon, votre code s'exécutera après tous les gestionnaires, ce qui lui permettra d'émuler davantage un gestionnaire d'événements "normal".

Bien que les directives officielles de conception du framework recommandent le contraire, la plupart des concepteurs de classes confieront en réalité à la méthode OnXxx() la responsabilité du déclenchement de l'événement réel, comme ceci :

protected virtual void OnClick(EventArgs e)
{
    if (Click != null) Click(this, e);
}

...donc si vous héritez de la classe et n'appelez pas base.OnClick(e), l'événement Click ne se déclenchera jamais.

Alors oui, même si ça je ne devrais pas que ce soit le cas selon les directives de conception officielles, je pense que cela vaut la peine d'appeler base.OnInit(e) juste pour être sûr.

les directives officielles de conception du cadre recommandent le contraire

Ils font?Je suis curieux, j'ai toujours pensé le contraire, et lire les directives de conception du framework et exécuter FxCop n'a fait que consolider mon point de vue.J'avais l'impression que les événements devaient toujours être déclenchés à partir de méthodes virtuelles OnXxx(), qui prennent un paramètre EventArgs.

Il vaut probablement mieux procéder de cette façon, et ce débat disparaîtra.L'article est cependant intéressant, d'autant plus que le .NET Framework ne respecte pas cette directive.

@Ch00k et @Scott je ne sais pas - j'aime le OnNom de l'événement modèle moi-même.Et oui, je fais partie des personnes coupables d'avoir déclenché l'événement avec cette méthode.

Je pense que remplacer la méthode On* et appeler celle de base est la voie à suivre.Gérer vos propres événements semble être une erreur d’une manière ou d’une autre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top