2011-10-13 8 views
12

Qual è la differenza tra i due?MethodInvoke delegato o espressione lambda

Invoke((MethodInvoker) delegate { 
     checkedListBox1.Items.RemoveAt(i); 
     checkedListBox1.Items.Insert(i, temp + validity); 
     checkedListBox1.Update(); 
    } 
); 

vs

Invoke((MethodInvoker) 
    (
     () => 
     { 
      checkedListBox1.Items.RemoveAt(i); 
      checkedListBox1.Items.Insert(i, temp + validity); 
      checkedListBox1.Update(); 
     } 
    ) 
); 

C'è qualche ragione per usare l'espressione lambda? Ed è il delegato di casting (MethodInvoker) e lambda in tipo MethodInvoker? Che tipo di espressione non richiederebbe un cast (MethodInvoker)?

risposta

16

1) L'espressione lambda è un po 'più corto e più pulita

2) Sì

3) Si potrebbe utilizzare il tipo di azione, in questo modo:

Invoke(new Action(
    () => 
    { 
     checkedListBox1.Items.RemoveAt(i); 
     checkedListBox1.Items.Insert(i, temp + validity); 
     checkedListBox1.Update(); 
    } 
) 
); 
+0

Vedo, il tipo di azione. Qualche differenza nell'uso del tipo di azione rispetto al casting? – Jack

+0

Ecco una discussione sull'azione vs methodinvoker: http://stackoverflow.com/questions/1167771/methodinvoker-vs-action-for-control-begininvoke – hcb

+0

Non ne ero a conoscenza, grazie amico! – TheGateKeeper

2

I due approcci sono equivalenti. Il primo è noto come metodo anonimo ed è una precedente funzionalità .net 2.0. Il lambda non dovrebbe richiedere un cast.

Preferirei la lambda, perché ha un uso più diffuso nel moderno sviluppo C# /. Il delegato anonimo non offre nulla oltre il lambda. Il lambda consente l'inferenza del tipo, che va dal comodo al necessario in alcuni casi.

1

MethodInvoker fornisce un semplice delegato che è usato per invocare un metodo con un elenco di parametri void. Questo delegato può essere utilizzato quando si effettuano chiamate al metodo Invoke di un controllo o quando è necessario un delegato semplice ma non si desidera definirne uno da soli.

Un'azione invece può richiedere fino a 4 parametri.