Question

Cette question a déjà une réponse ici:

J'utilise ReSharper 5.1 analyse de code plusieurs fois d'un je reçois un commentaire de ReSharper comme

"désabonnement de l'événement par l'intermédiaire délégué anonyme"

#Part of Code  

if (((bool)e.NewValue))
{
    listView.PreviewTextInput += (o,args) =>
        listView_PreviewTextInput(o,args,listView);
}
else
{
    listView.PreviewTextInput -= (o, args) => 
        listView_PreviewTextInput(o, args, listView);
}

Comment pourrais-je corriger ou optimze cette chose

Était-ce utile?

La solution

Vous pouvez extraire le lambda à une variable:

EventHandler func = (sender, e) =>
    listView_PreviewTextInput(sender, e, listView);

if (((bool)e.NewValue))
{
    listView.PreviewTextInput += func;
}
else
{
    listView.PreviewTextInput -= func;
}

Autres conseils

Attention! réponse acceptée de Steven est mauvais , tout ce qu'il fait est juste masquer un problème qui ReSharper est un avertissement à propos.

est exécutée chaque fois que le code donné

 EventHandler func = (sender, e) =>
     listView_PreviewTextInput(sender, e, listView);

vous obtiendrez une nouvelle (puisque vous pouvez saisir différentes listView) instance de délégué anonyme enregistrée à func, une instance qui n'est pas encore souscrit à des événements, donc à son tour ce code

listView.PreviewTextInput -= func;

sera effectivement rien, puisque vous ne pouvez pas vous désabonner d'un événement que vous n'êtes pas abonné. Cela conduira à des bugs ahurissants comme gestionnaires d'événements « appelé deux fois », les fuites de mémoire, etc.

En fait, Jon Skeet dit peut travailler dans de certains cas:

La spécification C # indique explicitement (IIRC) que si vous avez deux fonctions anonymes (méthodes anonymes ou des expressions lambda) il peut ou ne peut pas créer une égalité des délégués de ce code.

par exemple. lorsque le compilateur ne génère pas de nouvelle instance à chaque fois, vous verrez bien le comportement.

Mais ce n'est pas fiable et certainement ne fonctionnerait pas dans le cas décrit en question de démarrage avec listView variables capturées.

Donc, ma suggestion est:

Utiliser des fonctions anonymes comme gestionnaires d'événements SEULEMENT si vous ne devez retirer.

scroll top