studio - porque usar delegate c#
¿Qué hace esta llamada de delegado en esta línea de código(C#)? (9)
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 desencadena en algún momento durante el proceso de inicio de sesión.
La sintaxis
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?"));
}
}
Esto es de un ejemplo que acompaña al conjunto agsXMPP .Net. He leído sobre los delegados, pero no estoy seguro de cómo encaja con esta línea de código (que espera que ocurra el inicio de sesión, y luego envía un mensaje. Creo 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?"));
};
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 las versiones anteriores de .Net (he excluido las declaraciones de clase y demás, y solo guardé 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 ejecutar cuando se dispara el evento xmpp 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 puede suministrarse como 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 ejecuta cada vez que se activa el evento OnLogin.
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?"));
}
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 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 desencadenan debido al evento onLogin
.
Te estás suscribiendo al evento OnLogin en xmpp.
Esto significa que cuando xmpp activa este evento, el código dentro del delegado anónimo se activará. Es una forma 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);
}
El delegate(object o){..}
le dice al compilador que empaquete lo que está dentro de los corchetes como un objeto para ser ejecutado más tarde, en este caso cuando se dispara OnLogin
. Sin la instrucción delegate()
, el compilador pensaría que está intentando ejecutar una acción en el medio de una sentencia assignemnt y le dará errores.
OnLogin
en xmpp es probablemente un evento declarado así:
public event LoginEventHandler OnLogin;
donde LoginEventHandler
es como 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 de LoginEventHandler
.
En su ejemplo, pasa un método anónimo utilizando 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 de delegado esperada por el evento OnLogin
(tipo de devolución de vacío + argumento de un objeto). También podría eliminar el object o
parámetro aprovechando la contravariancia , ya que no se usa 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?"));
};