Что такое + = (o, arg) => на самом деле достижение?

Извините, что спросила всех, но я старый парень Vb.net, который перешел на С#. У меня есть следующий фрагмент кода, который, похоже, активируется при запуске (в данном случае) метода postAsync. Я просто не понимаю, что делает код (следующим образом): -

app.PostCompleted +=
    (o, args) =>
    {
        if (args.Error == null)
        {
            MessageBox.Show("Picture posted to wall successfully.");
        }
        else
        {
            MessageBox.Show(args.Error.Message);
        }
    };

если бы кто-нибудь мог объяснить, что на самом деле происходит + = (o, args) = > , я был бы так любезен....

Большое спасибо заранее. Тим

Ответы

Ответ 1

(o,args) => определяет лямбда-выражение, которое принимает два параметра с именем o и args. Типы этих параметров выводятся в соответствии с типом PostCompleted (если PostCompleted является EventHandler, то они будут соответственно типа Object и EventArgs). Тогда тело выражения следует после =>.

Результат добавляется как обработчик PostCompleted.

Как таковой, это менее подробный способ написать:

app.PostCompleted += delegate(object o, EventArgs args)
{
    // ...
};

Это сокращение для:

void YourHandler(object o, EventArgs args)
{
    // ...
}

// ...

app.PostCompleted += YourHandler;

Ответ 2

Это добавленный обработчик события PostCompleted с использованием выражения лямбда. Он похож на

  app.PostCompleted += MyHandler;

  // ...

  private void MyHandler(object sender, EventArgs e) {
      // ...
  }

Но при использовании лямбда-выражений вы не можете легко отсоединить обработчик.

Ответ 3

Это сокращение для делегата, определяющего обработчик событий для события завершения POST:

app.PostCompleted += delegate(object o, EventArgs args) { 
    // ...
};

См. также Анонимные методы.

Ответ 4

Предполагая, что PostCompleted - это событие, вы в основном создаете обработчик событий с использованием лямбда-нотации.

Этот фрагмент кода эквивалентен:

app.PostCompleted += delegate (o, args)
{
    if (args.Error == null)
    {
        MessageBox.Show("Picture posted to wall successfully.");
    }
    else
    {
        MessageBox.Show(args.Error.Message);
    }
};

Ответ 5

эквивалент vb.net будет выглядеть следующим образом:

AddHandler app.PostCompleted, Function(o, args)
        ''# ...
    End Function

Обратите внимание, что для этого требуется Visual Studio 2010/.Net 4, но код С# работает в Visual Studio 2008/.Net 3.5.

Но это только отчасти верно. В С# это способ определить метод как обработчик события в одном месте. В VB.Net вы можете использовать ключевое слово Handles, поэтому фактический эквивалент может выглядеть примерно так:

Public Sub App_PostCompleted(ByVal Sender as Object, ByVall e As EventArgs) Handles app.PostCompleted
    ''#
End Sub

Но даже это не полностью эквивалентно, так как вы дали методу имя и можете его вызвать из любого места. Единственная ссылка на код С# (и, следовательно, единственный способ ее вызова) - это подписка на события.

Ответ 6

Часть (o,args) => является lambda expression, которая является анонимной функцией.

часть += назначает выражение лямбда, которое вызывается при срабатывании события.