Che cosa è questo delegato chiamata a compiere in questa riga di codice (C#)?

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

  •  09-06-2019
  •  | 
  •  

Domanda

Questo è un esempio che accompagna il agsXMPP .Net assembly.Ho letto sul delegati, ma non sono sicuro di come che si adatta con questa riga di codice (che attende per l'accesso si verifica, e quindi invia un messaggio.Credo che quello che sto cercando è una comprensione del perché delegate(0) esegue questa operazione, in termini semplici, sono in grado di capire.

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

Soluzione

Il delegate(object o){..} dice al compilatore di un pacchetto tutto ciò che è all'interno delle parentesi quadre, come un oggetto, da eseguire successivamente, in questo caso, quando OnLogin viene licenziato.Senza delegate() istruzione, il compilatore potrebbe pensare che sono di legatura per eseguire un'azione in mezzo a un assignemnt istruzione e dare errori.

Altri suggerimenti

È esattamente lo stesso come

xmpp.OnLogin += EventHandler(MyMethod);

Dove MyMethod è

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

Come Abe notato, questo codice è la creazione di una funzione anonima.Questo:


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

sarebbe stato realizzato come segue nelle versioni precedenti di .Net (ho escluso dichiarazioni di classe e simili, e solo mantenuto gli elementi essenziali):


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

Cosa stai facendo in entrambi i casi è l'associazione di un tuo metodo di esecuzione quando il xmpp OnLogin viene generato un evento.

OnLogin su xmpp è probabilmente un evento ha dichiarato come questo :

public event LoginEventHandler OnLogin;

dove LoginEventHandler è come tipo di delegato probabilmente dichiarato :

public delegate void LoginEventHandler(Object o);

Ciò significa che, per iscriversi all'evento, è necessario fornire un metodo (o un metodo anonimo / espressione lambda) che corrisponde a un LoginEventHandler firma del delegato.

Nel tuo esempio, si passa un metodo anonimo utilizzando il delegate parola chiave:

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

Il metodo anonimo corrisponde alla firma del delegato previsto dal OnLogin evento (valore di ritorno void + un oggetto argomento).Si potrebbe anche rimuovere il object o parametro sfruttando il la controvarianza, poiché non è utilizzato all'interno del metodo anonimo del corpo.

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

Che è la creazione di una funzione anonima.Questa funzione è stata introdotta in C# 2.0

Serve come un metodo anonimo, quindi non c'è bisogno di dichiarare da qualche altra parte.E ' molto utile.

Cosa fa in questo caso è quello di allegare il metodo per la lista di azioni che vengono attivate a causa della onLogin evento.

Concordato con Abe, questo è un metodo anonimo.Un metodo anonimo è solo che-un metodo senza un nome, che può essere fornito come parametro argomento.

Ovviamente il OnLogin oggetto è un Evento;utilizzando un += l'operatore assicura che il metodo indicato dal delegato anonimo di cui sopra viene eseguito ogni volta che il OnLogin evento viene generato.

Fondamentalmente, il codice all'interno di {} viene eseguito quando l' "OnLogin" evento di xmpp viene generato un evento.In base al nome, immagino che, viene generato un evento, a un certo punto durante il processo di login.

La sintassi:

delegate(object o) { statements; }

si chiama un metodo anonimo.Il codice in questione sarebbe equivilent a questo:

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

Si sottoscrive il OnLogin evento in xmpp.

Questo significa che quando xmpp incendi di questo evento, il codice all'interno di un anonimo delegato fuoco.Un modo elegante per avere richiamate.

In Xmpp, qualcosa di simile a questo:

   // 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);
   }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top