disiscrizione evento tramite delegato anonimo [duplicato]
-
26-10-2019 - |
Domanda
Questa domanda ha già una risposta qui:
- Metodo Cancellati anonima in C # 11 risposte
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
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.