27 votes

Utilisation d'expressions lambda pour les gestionnaires d'événements

J'ai actuellement une page qui est déclarée comme suit:

 public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //snip
        MyButton.Click += (o, i) =>
        {
            //snip
        }
    }
}
 

Je n'ai récemment migré vers .NET 3.5 qu'à partir de 1.1, j'ai donc l'habitude d'écrire des gestionnaires d'événements en dehors de Ma question est; y a-t-il des inconvénients ou des pièges de performance que je devrais surveiller lors de l'utilisation de la méthode lambda pour cela? Je le préfère, car il est certainement plus concis, mais je ne veux pas sacrifier les performances pour l'utiliser. Merci.

34voto

Andrew Hare Points 159332

Il n'y a aucune incidence sur les performances, car le compilateur traduira votre expression lambda en un délégué équivalent. Les expressions lambda ne sont rien de plus qu'une fonction de langage que le compilateur traduit en exactement le même code que celui avec lequel vous avez l'habitude de travailler.

Le compilateur convertira le code que vous avez en quelque chose comme ceci:

 public partial class MyPage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        //snip
        MyButton.Click += new EventHandler(delegate (Object o, EventArgs a) 
        {
            //snip
        });
    }
}
 

16voto

Gabe Points 49718

En termes de performances, c'est la même chose qu'une méthode nommée. Le gros problème est lorsque vous effectuez les opérations suivantes:

 MyButton.Click -= (o, i) => 
{ 
    //snip 
} 
 

Il essaiera probablement de supprimer un lambda différent, en laissant celui d'origine là. La leçon est donc que c'est bien, sauf si vous voulez également pouvoir supprimer le gestionnaire.

9voto

EventHandler handler = (s, e) => MessageBox.Show("Woho");

button.Click += handler;
button.Click -= handler;

0voto

heisenberg Points 6120

Aucune implication sur les performances que je connaisse ou que je n'ai jamais rencontrée, pour autant que je sache que c'est juste du "sucre syntaxique" et que cela se résume à la même chose que l'utilisation de la syntaxe déléguée, etc.

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