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();
}
C'est tout à fait correct - bien qu'il y ait deux mises en garde:
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(); };
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:
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".
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.