web-dev-qa-db-fra.com

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
        }
    }
}

Ce n'est que récemment que je suis passé de la version 1.1 à .NET 3.5. Je suis donc habitué à écrire des gestionnaires d'événements en dehors de Page_Load. Ma question est; Existe-t-il des inconvénients ou des pièges en termes de performances à surveiller lors de l'utilisation de la méthode lambda? Je le préfère car il est certainement plus concis, mais je ne veux pas sacrifier la performance pour l’utiliser. Merci.

98
Christopher Garcia

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 fonctionnalité de langage que le compilateur traduit en code exactement identique à celui avec lequel vous êtes habitué.

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
        });
    }
}
97
Andrew Hare

En termes de performances, c'est la même chose qu'une méthode nommée. Le gros problème est lorsque vous procédez comme suit:

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

Il essaiera probablement de supprimer un lambda différent en laissant l'original. Donc, la leçon est que c'est bien, sauf si vous souhaitez également pouvoir supprimer le gestionnaire.

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

button.Click += handler;
button.Click -= handler;
39
usama wahab khan

Aucune conséquence en termes de performances que je sache ou que je n’ai jamais rencontrée, pour autant que je sache qu’il s’agit simplement de "sucre syntaxique" et compile jusqu’à la même chose que l’utilisation de la syntaxe de délégation, etc.

2
heisenberg