75 votes

Est-ce une mauvaise pratique d'écrire des gestionnaires d'événements en ligne ?

Est-ce une mauvaise pratique d'écrire des gestionnaires d'événements en ligne ?

En ce qui me concerne, je préfère l'utiliser lorsque je veux utiliser une variable locale dans le gestionnaire d'événements, comme dans l'exemple suivant :

Je préfère ça :

// This is just a sample
private void Foo()
{
    Timer timer = new Timer() { Interval = 1000 };
    int counter = 0; // counter has just this mission
    timer.Tick += (s, e) => myTextBox.Text = (counter++).ToString();
    timer.Start();
}

Au lieu de ça :

int counter = 0; // No need for this out of Boo & the event handler

private void Boo()
{
    Timer timer = new Timer() { Interval = 1000 };

    timer.Tick += timer_Tick;
    timer.Start();
}

void timer_Tick(object sender, EventArgs e)
{
    myTextBox.Text = (counter++).ToString();
}

89voto

Jon Skeet Points 692016

C'est tout à fait correct, mais il y a deux réserves :

  • Si vous modifiez une variable locale à partir d'une fermeture, vous devez vous assurer que vous comprenez ce que vous faites.
  • Vous ne pourrez pas vous désinscrire de l'événement.

En général, je ne mets en ligne vraiment de simples gestionnaires d'événements - pour tout ce qui est plus impliqué, j'utilise des expressions lambda (ou des méthodes anonymes) pour m'abonner avec un appel à une méthode plus appropriée :

// We don't care about the arguments here; SaveDocument shouldn't need parameters
saveButton.Click += delegate { SaveDocument(); };

3voto

Ian Ringrose Points 19115

Dans la plupart des cas, je préférerais avoir les méthodes séparées comme "timer_Tick()", mais je préférerais qu'elle soit appelée OnTimerTick() comme :

  • Quand je lis le cours, le blé est plus clair. Le "On" me dit que c'est un gestionnaire d'événement.
  • Il est plus facile de fixer un point d'arrêt dans la méthode dans le cas "inline".
  • L'événement est déclenché longtemps après le retour de l'entrepreneur "Foo", et je ne pense pas qu'il entre dans le champ d'action de l'entrepreneur.

Cependant, si l'événement n'est déclenché qu'avant le retour de la méthode déclarée en ligne et que l'objet sur lequel l'événement est déclenché a une portée limitée à la méthode déclarante, alors je pense que la version "en ligne" est meilleure. C'est pourquoi j'aime utiliser "in line" pour le délégué de comparaison qui est passé à une méthode de "tri".

-1voto

Liviu M. Points 3872

Vous mettez les deux échantillons ensemble. Il est clair que la deuxième option (que vous ne préférez pas) est la plus lisible.

La lisibilité et la maintenabilité du code sont très importantes. Gardez les choses simples, aussi faciles à comprendre que possible. Les expressions lambda sont généralement considérées comme plus difficiles à comprendre par la majorité des gens. Même si elles sont une seconde nature pour vous, ce n'est pas forcément le cas pour d'autres.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X