Что этот вызов делегата делает в этой строке кода (C #)? - PullRequest
4 голосов
/ 16 сентября 2008

Это пример, сопровождающий сборку agsXMPP .Net. Я читал о делегатах, но не уверен, как это вписывается в эту строку кода (которая ожидает входа в систему и затем отправляет сообщение. Я думаю, что я ищу, это понимание того, почему 1001 * выполняет это в простых терминах, которые я могу понять.

xmpp.OnLogin += delegate(object o) { 
    xmpp.Send(new Message(new Jid(JID_RECEIVER), 
    MessageType.chat, 
    "Hello, how are you?")); 
};

Ответы [ 9 ]

4 голосов
/ 16 сентября 2008

Это точно так же, как

xmpp.OnLogin += EventHandler(MyMethod);

Где MyMethod

public void MyMethod(object o) 
{ 
    xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); 
}
2 голосов
/ 16 сентября 2008

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?")); 
                };
2 голосов
/ 16 сентября 2008

Как отметил Эйб, этот код создает анонимную функцию. Это:


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.

1 голос
/ 16 сентября 2008

delegate(object o){..} говорит компилятору упаковать все, что находится внутри скобок, как объект, который будет выполнен позже, в этом случае, когда запускается OnLogin. Без оператора delegate() компилятор подумал бы, что вы пытаетесь выполнить действие в середине оператора assignemnt, и выдает ошибки.

0 голосов
/ 16 сентября 2008

Вы подписываетесь на событие 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);
   }
0 голосов
/ 16 сентября 2008

По сути, код внутри {} будет выполняться при возникновении события 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?"));
  }
}
0 голосов
/ 16 сентября 2008

Согласен с Абэ, это анонимный метод. Анонимный метод - это просто метод без имени, который может быть предоставлен в качестве аргумента параметра.

Очевидно, что объект OnLogin является событием; использование оператора + = гарантирует, что метод, указанный анонимным делегатом выше, выполняется всякий раз, когда возникает событие OnLogin.

0 голосов
/ 16 сентября 2008

Он служит анонимным методом, поэтому вам не нужно объявлять его где-то еще. Это очень полезно.

В этом случае он добавляет этот метод к списку действий, которые запускаются из-за события onLogin.

0 голосов
/ 16 сентября 2008

Это создание анонимной функции. Эта функция была введена в C # 2.0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...