¿Qué hace esta llamada de delegado en esta línea de código (C #)?

Esto es de un ejemplo que acompaña al ensamblaje .Net de agsXMPP. He leído sobre los delegates, pero no estoy seguro de cómo se ajusta a esta línea de código (que espera el inicio de sesión, y luego envía un mensaje. Supongo que lo que estoy buscando es una comprensión de por qué delegate(0) logra esto, en el tipo de términos simples que puedo entender.

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

El delegate(object o){..} le dice al comstackdor que empaque todo lo que está dentro de los corchetes como un objeto que se ejecutará más adelante, en este caso cuando se OnLogin . Sin la statement del delegate() , el comstackdor pensaría que está tratando de ejecutar una acción en medio de una statement de asignación y le dará errores.

Es exactamente lo mismo que

 xmpp.OnLogin += EventHandler(MyMethod); 

Donde mymethod es

 public void MyMethod(object o) { xmpp.Send(new Message(new Jid(JID_RECEIVER), MessageType.chat, "Hello, how are you?")); } 

Como observó Abe, este código está creando una función anónima. Esta:

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

se habría logrado de la siguiente manera en versiones anteriores de .Net (he excluido declaraciones de clase y similares, y solo conservé los elementos esenciales):

 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); 

Lo que está haciendo en cualquier caso es asociar un método suyo para que se ejecute cuando se active el evento OnLogin de xmpp.

OnLogin en xmpp es probablemente un evento declarado así:

 public event LoginEventHandler OnLogin; 

donde LoginEventHandler es el tipo de delegado probablemente declarado como:

 public delegate void LoginEventHandler(Object o); 

Eso significa que para suscribirse al evento, debe proporcionar un método (o un método anónimo / expresión lambda ) que coincida con la firma del delegado LoginEventHandler .

En su ejemplo, usted pasa un método anónimo usando la palabra clave delegate :

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

El método anónimo coincide con la firma del delegado esperada por el evento OnLogin (tipo de retorno nulo + un argumento de objeto). También puede eliminar el object o parámetro que aprovecha la contravarianza , ya que no se utiliza dentro del cuerpo del método anónimo.

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

Eso es crear una función anónima. Esta característica fue introducida en C # 2.0

Sirve como un método anónimo, por lo que no necesita declararlo en otro lugar. Es muy útil.

Lo que hace en ese caso es adjuntar ese método a la lista de acciones que se activan debido al evento onLogin .

De acuerdo con Abe, este es un método anónimo. Un método anónimo es solo eso: un método sin nombre, que se puede proporcionar como un argumento de parámetro.

Obviamente el objeto OnLogin es un Evento; el uso de un operador + = garantiza que el método especificado por el delegado anónimo anterior se ejecute siempre que se produzca el evento OnLogin.

Básicamente, el código dentro de {} se ejecutará cuando se active el evento “OnLogin” del evento xmpp. Según el nombre, supongo que el evento se activa en algún momento durante el proceso de inicio de sesión.

La syntax:

 delegate(object o) { statements; } 

Es un método llamado anónimo. El código en su pregunta sería equivalente a esto:

 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?")); } } 

Te estás suscribiendo al evento OnLogin en xmpp.

Esto significa que cuando xmpp dispara este evento, se disparará el código dentro del delegado anónimo. Es una manera elegante de tener devoluciones de llamada.

En Xmpp, algo como esto está sucediendo:

  // 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); }