Что такое + = (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, которая является анонимной функцией.
часть +=
назначает выражение лямбда, которое вызывается при срабатывании события.