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

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Esto es de un ejemplo que acompaña a la agsXMPP .Neto de la asamblea.He leído en los delegados, pero no estoy seguro de cómo encaja con esta línea de código (que se espera para el inicio de sesión y, a continuación, envía un mensaje.Supongo que lo que estoy buscando es una comprensión de por qué delegate(0) logra esto, en la clase de simples términos que pueda entender.

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

Solución

El delegate(object o){..} indica al compilador que el paquete de lo que hay dentro de los paréntesis como un objeto para ser ejecutado más tarde, en este caso, cuando OnLogin es despedido.Sin el delegate() declaración, el compilador podría pensar que usted está atando para ejecutar una acción en el medio de un assignemnt declaración y le dará errores.

Otros consejos

Es exactamente el 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 Abe señaló, este código es crear una función anónima.Este:


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

habría sido logra de la siguiente manera en las versiones anteriores de .Neto (he excluido declaraciones de clase y tal, y sólo mantiene 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ás haciendo en cada caso es la asociación de un método de la suya para que se ejecute cuando el xmpp OnLogin evento es disparado.

OnLogin en xmpp es, probablemente, un evento declarado como este :

public event LoginEventHandler OnLogin;

donde LoginEventHandler es el tipo de delegado probablemente declarado como :

public delegate void LoginEventHandler(Object o);

Eso significa que con el fin de suscribirse al evento, es necesario proporcionar un método (o un método anónimo / expresión lambda), que coincide con el LoginEventHandler firma del delegado.

En el ejemplo, se pasa a un método anónimo el uso de la delegate palabra clave:

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 esperado por el OnLogin evento (tipo de retorno void + un argumento de objeto).También puede quitar la object o parámetro de aprovechamiento de la contravarianza, ya que no se utiliza en el método anónimo cuerpo.

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 se introdujo en C# 2.0

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

Lo que se hace en ese caso es adjuntar el método de la lista de acciones que se desencadenan a causa de la onLogin evento.

De acuerdo con Abe, este es un método anónimo.Un método anónimo es sólo eso-un método sin un nombre, que puede ser suministrado como un parámetro argumento.

Obviamente el OnLogin objeto es un Evento;el uso de un operador += se asegura de que el método especificado por el delegado anónimo de arriba es ejecutado cada vez que el evento OnLogin es elevada.

Básicamente, el código dentro de las {} se ejecutará cuando el "OnLogin" caso de los xmpp evento es disparado.Basado en el nombre, me imagino que el evento se desencadena en algún momento durante el proceso de inicio de sesión.

La sintaxis:

delegate(object o) { statements; }

es un llamado a un método anónimo.El código en tu 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?"));
  }
}

Usted se suscribe al evento OnLogin en xmpp.

Esto significa que cuando xmpp los incendios de este evento, el código dentro de la anónima delegado de fuego.Su elegante manera de tener las devoluciones de llamada.

En Xmpp, algo como esto que está pasando:

   // 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);
   }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top