Что этот вызов делегата делает в этой строке кода (C #)?

StackOverflow https://stackoverflow.com/questions/73024

  •  09-06-2019
  •  | 
  •  

Вопрос

Это взято из примера, прилагаемого к сборке 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);
   }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top