Делегат MethodInvoke или лямбда-выражение

Какая разница между двумя?

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

Есть ли причина использовать лямбда-выражение? И (MethodInvoker) приводит делегата и лямбда к типу MethodInvoker? Какое выражение не требует приведения (MethodInvoker)?


person Jack    schedule 13.10.2011    source источник


Ответы (3)


1) Лямбда-выражение несколько короче и чище

2) Да

3) Вы можете использовать тип действия, например:

Invoke(new Action(
    () => 
    {
        checkedListBox1.Items.RemoveAt(i);
        checkedListBox1.Items.Insert(i, temp + validity);
        checkedListBox1.Update();
    }
)
);
person hcb    schedule 13.10.2011
comment
Понятно, тип Action. Есть ли различия в использовании типа действия и приведения? - person Jack; 13.10.2011
comment
вот обсуждение действия против methodinvoker: stackoverflow .com/questions/1167771/ - person hcb; 13.10.2011

Эти два подхода эквивалентны. Первый известен как анонимный метод и является более ранней возможностью .net 2.0. Лямбда не должна требовать приведения.

Я бы предпочел лямбду, потому что она более широко используется в современной разработке C#/.net. Анонимный делегат ничего не предлагает по сравнению с лямбдой. Лямбда допускает вывод типов, который в некоторых случаях варьируется от удобного до необходимого.

person Brent Arias    schedule 13.10.2011

MethodInvoker предоставляет простой делегат, который используется для вызова метода с пустым списком параметров. Этот делегат можно использовать при вызовах метода Invoke элемента управления или когда вам нужен простой делегат, но вы не хотите определять его самостоятельно.

С другой стороны, действие может принимать до 4 параметров.

person Ryder    schedule 14.04.2012