Domanda

Questa domanda ha già una risposta qui:

Sto usando ReSharper analisi 5.1 codice molte volte al ottengo un commento da ReSharper come

"disiscrizione evento tramite delegato anonimo"

#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);
}

Come potrei correggere o optimze questa cosa

È stato utile?

Soluzione

È possibile estrarre il lambda a una variabile:

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

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

Altri suggerimenti

Attenzione! accettato risposta da Steven è sbagliato , tutto ciò che fa è solo mascherare un problema che ReSharper è allarme di.

viene eseguito ogni volta dato codice

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

si otterrà una nuova (in quanto si può catturare listView diverso) istanza del delegato anonima salvato func, un'istanza che non è sottoscritto tutti gli eventi ancora, in modo di trasformare questo codice

listView.PreviewTextInput -= func;

sarà effettivamente fare nulla, dal momento che non puoi annullare l'iscrizione da un evento non si è iscritto a. Questo porterà a bug da capogiro, come i gestori di eventi 'chiamato due volte', le perdite di memoria, ecc.

In realtà, Jon Skeet dice che può funzionare in alcuni casi :

La specifica C # afferma esplicitamente (IIRC) che, se si hanno due funzioni anonime (metodi anonimi o espressioni lambda) è Maggio o non possono creare pari delegati provenienti da quel codice.

es. quando compilatore non genera nuova istanza ogni volta, vedrete un comportamento piacevole.

Ma non è affidabile e di certo non avrebbe funzionato nel caso descritto in questione avviamento con listView variabili catturato.

Quindi il mio suggerimento è:

Utilizzare le funzioni anonime come i gestori di eventi SOLO se non si sarà mai avere di annullare l'iscrizione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top