2008-09-16 7 views
4

Dies ist ein Beispiel für die Montage von agsXMPP .Net. Ich habe Delegaten gelesen, bin mir aber nicht sicher, wie das zu dieser Codezeile passt (die auf die Anmeldung wartet und dann eine Nachricht sendet. Ich denke, ich suche nach einem Verständnis dafür, warum delegate(0) erreichen dies, in der Art von einfachen Worten kann ich verstehen.Was macht dieser Delegat-Aufruf in dieser Codezeile (C#)?

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

Antwort

1

Die delegate(object o){..} die Compiler sagen zu verpacken, was innerhalb der Klammern ist als ein Objekt später ausgeführt werden soll, in diesem Fall wenn OnLogin ausgelöst wird. Ohne die delegate()-Anweisung würde der Compiler denken, dass Sie eine Aktion in der Mitte einer Anweisung ausführen und Ihnen Fehler geben.

+1

zu amüsieren Amüsant, dass von all den ausgezeichneten Antworten hier, der vage wird ausgewählt. – FlySwat

0

, dass eine anonyme Funktion erstellt wird. Dieses Feature wurde eingeführt in C# 2.0

0

Es dient als anonyme Methode, so dass Sie nicht muss es an anderer Stelle deklariert werden. Es ist sehr nützlich.

Was es in diesem Fall tut, ist, diese Methode an die Liste der Aktionen tha anzuhängen t werden wegen des Ereignisses onLogin ausgelöst.

4

Es ist genau die gleiche wie

xmpp.OnLogin += EventHandler(MyMethod); 

Wo MyMethod ist

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

Nun, es ist nicht genau das gleiche, denn innerhalb der anonymen Methode haben Sie Zugriff auf die lokalen Variablen des Bereichs, in dem der Delegat definiert ist. – Ishmaeel

+0

Sie haben Recht, obwohl in diesem Beispiel – juan

+0

Ich denke, dass Sie vor dem EventHandler ein neues benötigen würden. Und ich glaube, EVentHandler erwartet einen EventArgs-Parameter. Sie müssten einen neuen Delegattyp deklarieren, der nur einen Objektparameter benötigt, denke ich trotzdem! Siehe Remis Antwort –

0

Vereinbart mit Abe, dies ist eine anonyme Methode. Eine anonyme Methode ist nur eine Methode ohne Namen, die als Parameterargument angegeben werden kann.

Offensichtlich ist das OnLogin-Objekt ein Ereignis; Mit einem + = -Operator wird sichergestellt, dass die vom anonymen Delegaten oben angegebene Methode immer dann ausgeführt wird, wenn das OnLogin-Ereignis ausgelöst wird.

0

Grundsätzlich wird der Code innerhalb der {} ausgeführt, wenn das Ereignis "OnLogin" des xmpp -Ereignisses ausgelöst wird. Aufgrund des Namens würde ich davon ausgehen, dass das Ereignis zu einem bestimmten Zeitpunkt während des Anmeldevorgangs ausgelöst wird.

Die Syntax:

delegate(object o) { statements; } 

ist eine anonyme Methode genannt. Der Code in Ihrer Frage würde dies equivilent werden:

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

Sie melden sich auf der OnLogin Veranstaltung in xmpp.

Das bedeutet, wenn xmpp dieses Ereignis auslöst, wird der Code innerhalb des anonymen Delegaten ausgelöst. Es ist eine elegante Möglichkeit, Rückrufe zu haben.

In XMPP, so etwas wie dies vor sich geht:

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

Wie Abe bemerkt, dieser Code eine anonyme Funktion erstellt. Dieses:


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

wäre wie folgt in älteren Versionen von erreicht worden.Net (Ich habe Klasse Erklärungen ausgeschlossen und so, und hielt nur die wesentlichen Elemente):


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

Was Sie in jedem Fall tun, ein Verfahren von Ihnen ist Assoziieren zu laufen, wenn die xmpp OnLogin Ereignis ausgelöst wird.

2

OnLogin auf xmpp ist wahrscheinlich ein Ereignis wie folgt deklariert:

public event LoginEventHandler OnLogin; 

wo LoginEventHandler als Delegattyp ist wahrscheinlich erklärt, wie:

public delegate void LoginEventHandler(Object o); 

Das bedeutet, dass, um das Ereignis zu abonnieren, Sie müssen eine Methode (oder eine anonymous method/lambda expression) bereitstellen, die der LoginEventHandler Delegiertensignatur entspricht.

In Ihrem Beispiel, übergeben Sie eine anonyme Methode, um die delegate Schlüsselwort:

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

Die anonyme Methode entspricht der Delegierten Unterzeichnung durch die Veranstaltung OnLogin erwartet (void Rückgabetyp + ein Objekt Argument). Sie können auch den Parameter object o mithilfe der contravariance entfernen, da er nicht im Körper der anonymen Methode verwendet wird.