2011-10-13 19 views
12

Jaka jest różnica między tymi dwoma?MethodInvoke delegate lub lambda expression

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

Czy istnieje jakikolwiek powód, aby użyć wyrażenia lambda? Czy jest to delegacja odlewania i lambda (MethodInvoker) do typu MethodInvoker? Jakiego rodzaju wyrażenie nie wymagałoby obsady (MethodInvoker)?

Odpowiedz

16

1) Wyrażenie lambda jest nieco krótsza i czystsze

2) Tak

3) można użyć typu działania, na przykład:

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

Widzę, rodzaj akcji. Jakiekolwiek różnice w korzystaniu z typu akcji w porównaniu z castowaniem? – Jack

+0

tutaj jest dyskusja na temat działania vs methodinvoker: http://stackoverflow.com/questions/1167771/methodinvoker-vs-action-for-control-begininvoke – hcb

+0

Nie wiedział o tym, dzięki kolego! – TheGateKeeper

2

Te dwa podejścia są równoważne. Pierwsza znana jest jako metoda anonimowa i jest wcześniejszą wersją .net 2.0. Lambda nie powinna wymagać obsady.

Wolałbym lambdę, ponieważ ma bardziej wszechobecne zastosowanie w nowoczesnym rozwoju C#/.net. Anonimowy delegat nie oferuje niczego ponad lambdę. Lambda pozwala na wnioskowanie o typie, które w niektórych przypadkach mieści się w zakresie od wygodnego do niezbędnego.

1

MethodInvoker zapewnia prostą delegata że służy do wywoływania metody z pustą listą parametrów. Ten delegat może być używany podczas wykonywania wywołań metody Invoke formantu lub gdy potrzebujesz prostego delegata, ale nie chcesz go definiować samodzielnie.

A Działanie z drugiej strony może zająć do 4 parametrów.