2012-01-10 10 views
14

Sto usando ReSharper 5.1 analisi del codice molte volte ho un commento da ReSharper comedisiscrizione evento tramite delegato anonima

"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 avrei potuto correggere o optimze questa cosa

risposta

29

È possibile estrarre il Lamdba ad una variabile:

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

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

Grazie ma "EventHandler" dovrebbe essere specifico vero ?? Mi ha dato un errore ... 'System.EvenTArgs non è assegnabile a TextCompositonEventArgs' – Ankesh

+0

In questo caso' listView.PreviewTextInput' non è un 'EventHandler', ma probabilmente un' EventHandler ', ma non c'è modo per che io sappia, dal momento che non l'hai mostrato nella tua domanda. – Steven

+0

Yup .. mio male .. Grazie ne modi ... :) – Ankesh

6

Avvertenza! Accepted answer da Steven è errato, tutto ciò che fa è solo mascherare un problema di cui è presente un avvertitore.

Ogni volta determinato codice viene eseguito

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

si otterrà una fresca (in quanto si può catturare diversi listView) istanza del delegato anonima salvato func, un'istanza che non è sottoscritto tutti gli eventi ancora, in modo a sua volta questo codice

listView.PreviewTextInput -= func; 

non farà assolutamente nulla, poiché non puoi annullare l'iscrizione a un evento a cui non sei iscritto. Questo porterà a bug da capogiro, come i gestori di eventi 'chiamato due volte', le perdite di memoria ecc

In realtà, Jon Skeet dice may work in some cases:

La specifica C# afferma esplicitamente (IIRC) che, se si dispone di due funzioni anonime (metodi anonimi o espressioni lambda) è può o non può creare uguali delegati da tale codice.

ad es. quando il compilatore non genera nuove istanze ogni volta, vedrai un buon comportamento.

Ma questo non è affidabile e sicuramente non funzionerebbe nel caso descritto nella domanda iniziale con variabile acquisita listView.

Quindi il mio suggerimento è:

Usare le funzioni anonime come gestori di eventi solo se si avranno mai di annullare l'iscrizione.

Problemi correlati