Что этот вызов делегата делает в этой строке кода (C #)?
Вопрос
Это взято из примера, прилагаемого к сборке agsXMPP .Net.Я читал о делегатах, но не уверен, как это согласуется с этой строкой кода (которая ожидает входа в систему, а затем отправляет сообщение.Я думаю, то, что я ищу, - это понимание того, почему delegate(0)
достигает этого в тех простых терминах, которые я могу понять.
xmpp.OnLogin += delegate(object o) {
xmpp.Send(new Message(new Jid(JID_RECEIVER),
MessageType.chat,
"Hello, how are you?"));
};
Решение
Тот Самый delegate(object o){..}
сообщает компилятору упаковать все, что находится внутри скобок, как объект, который будет выполнен позже, в данном случае, когда OnLogin
уволен.Без delegate()
в этом случае компилятор подумает, что вы привязываетесь к выполнению действия в середине инструкции assignemnt, и выдаст вам ошибки.
Другие советы
Это точно то же самое, что и
xmpp.OnLogin += EventHandler(MyMethod);
Где находится мой метод
public void MyMethod(object o)
{
xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?"));
}
Как отметил Эйб, этот код создает анонимную функцию.Это:
xmpp.OnLogin += delegate(object o)
{
xmpp.Send(
new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?"));
};
в более старых версиях .Net это было бы выполнено следующим образом (я исключил объявления классов и тому подобное и просто сохранил основные элементы):
delegate void OnLoginEventHandler(object o);
public void MyLoginEventHandler(object o)
{
xmpp.Send(
new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?"));
}
[...]
xmpp.OnLogin += new OnLoginEventHandler(MyLoginEventHandler);
То, что вы делаете в любом случае, - это связывание вашего метода для запуска при запуске события xmpp OnLogin.
OnLogin
в xmpp, вероятно, событие объявлено следующим образом :
public event LoginEventHandler OnLogin;
где LoginEventHandler
является ли тип делегата, вероятно, объявленным как :
public delegate void LoginEventHandler(Object o);
Это означает, что для того, чтобы подписаться на событие, вам необходимо предоставить метод (или анонимный метод / лямбда - выражение), которые соответствуют LoginEventHandler
подпись делегата.
В вашем примере вы передаете анонимный метод, используя delegate
ключевое слово:
xmpp.OnLogin += delegate(object o)
{
xmpp.Send(new Message(new Jid(JID_RECEIVER),
MessageType.chat,
"Hello, how are you?"));
};
Анонимный метод соответствует сигнатуре делегата, ожидаемой OnLogin
событие (возвращаемый тип void + один аргумент объекта).Вы также могли бы удалить object o
параметр, использующий контравариантность, поскольку он не используется внутри тела анонимного метода.
xmpp.OnLogin += delegate
{
xmpp.Send(new Message(new Jid(JID_RECEIVER),
MessageType.chat,
"Hello, how are you?"));
};
Это создание анонимной функции.Эта функция была введена в C # 2.0
Он служит анонимным методом, поэтому вам не нужно объявлять его где-то еще.Это очень полезно.
Что он делает в этом случае, так это присоединяет этот метод к списку действий, которые запускаются из-за onLogin
событие.
Согласен с Эйбом, это анонимный метод.Анонимный метод - это всего лишь метод без имени, который может быть указан в качестве аргумента параметра.
Очевидно, что объект OnLogin является событием;использование оператора += гарантирует, что метод, указанный анонимным делегатом выше, выполняется всякий раз, когда вызывается событие OnLogin.
По сути, код внутри {} будет выполняться при запуске события "OnLogin" события xmpp.Основываясь на названии, я бы предположил, что событие срабатывает в какой-то момент во время процесса входа в систему.
Синтаксис:
delegate(object o) { statements; }
вызывается анонимный метод.Код в вашем вопросе был бы эквивалентен этому:
public class MyClass
{
private XMPPObjectType xmpp;
public void Main()
{
xmpp.OnLogin += MyMethod;
}
private void MyMethod(object o)
{
xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?"));
}
}
Вы подписываетесь на событие OnLogin в xmpp.
Это означает, что когда xmpp запускает это событие, срабатывает код внутри анонимного делегата.Это элегантный способ иметь обратные вызовы.
В Xmpp происходит что-то подобное:
// Check to see if we should fire the login event
// ALso check to see if anything is subscribed to OnLogin
// (It will be null otherwise)
if (loggedIn && OnLogin != null)
{
// Anyone subscribed will now receive the event.
OnLogin(this);
}