web-dev-qa-db-fra.com

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?

Pour moi, je préfère l'utiliser lorsque je veux utiliser une variable locale dans le gestionnaire d'événements comme suit:

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 cela:

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();
}
57
Homam

C'est tout à fait correct - bien qu'il y ait deux mises en garde:

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

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

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

Dans la plupart des cas, je préfère avoir des méthodes distinctes comme "timer_Tick ()", mais je préfère qu'il soit appelé OnTimerTick () comme:

  • Quand je lis la classe, il est plus clair que le blé se passe. Le "On" me dit que son gestionnaire d'événements can.
  • Il est plus facile de définir un point d'arrêt dans la méthode dans le cas "en ligne".
  • L'événement est déclenché longtemps après le retour de l'entrepreneur "Foo", et je ne pense pas qu'il fonctionne dans le cadre de l'entrepreneur.

Cependant, si l'événement ne se déclenche qu'avant le retour de la méthode déclarée en ligne et que l'objet sur lequel l'événement est défini a une portée limitée à la méthode de déclaration, alors je pense que la version "en ligne" est meilleure. Par conséquent, j'aime utiliser "en ligne" pour que le délégué de comparaison soit passé à une méthode de "tri".

3
Ian Ringrose

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 que possible à comprendre. 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, pour d'autres non.

0
Liviu M.