C # hat zu diesem Zweck Delegierte . Sie werden häufig bei Ereignissen verwendet , da ein Ereignis automatisch eine Reihe von angehängten Delegaten (Ereignishandlern) aufrufen kann.
Tatsächlich ist ein Rückruf ein Zeiger auf ausführbaren Code, der als Argument an anderen Code übergeben wird. Die Seite muss überprüft werden
Gianluca Ghettini,
8
@G_G: Es gibt nichts, was besagt, dass es ein Zeiger sein muss. Dies liegt normalerweise daran, dass das Datensegment nicht ausführbar ist, dies ist jedoch technisch gesehen ein Implementierungsdetail.
Joey
Joey: Sie haben Recht, es ist ein Implementierungsdetail, aber selbst der Rückruf ist ein Implementierungsdetail. Sie können Ihren Code ohne einen einzigen Rückruf neu schreiben. Es ist wie 'while' vs 'for'.
Gianluca Ghettini
1051
Ich habe dich gerade getroffen,
und das ist verrückt,
aber hier ist meine Nummer (Delegierter).
Wenn also etwas passiert (Ereignis),
ruf mich vielleicht an (Rückruf)?
Total coole Erklärung. Ich werde diese Erklärung verwenden, wenn jemand fragt, hoffe ich kann Rechte bekommen, um sie zu verwenden?
Nikola Davidovic
15
+1: Ich liebe es. Es ruiniert das Lied, aber das sollte lauten: "Aber hier ist meine Nummer und die Anleitung zur Verwendung eines bestimmten Telefontyps (Delegierter)"
Gone Coding
8
Lerne Delegierten mit Lächeln im Gesicht :-)
Aakash
8
Beste Erklärung aller Zeiten!
Zhengtonic
3
Beachten Sie, dass das Unterrichten von Delegierten an andere Personen mit dieser Erklärung nur mit einer guten Choreografie funktioniert :)
Sébastien Sevrin
87
Ein Rückruf ist eine Funktion, die aufgerufen wird, wenn ein Prozess eine bestimmte Aufgabe ausführt.
Die Verwendung eines Rückrufs erfolgt normalerweise in asynchroner Logik.
Um einen Rückruf in C # zu erstellen, müssen Sie eine Funktionsadresse in einer Variablen speichern. Dies wird mit einer delegateoder der neuen Lambda-Semantik Funcoder erreicht Action.
publicdelegatevoidWorkCompletedCallBack(string result);publicvoidDoWork(WorkCompletedCallBack callback){
callback("Hello world");}publicvoidTest(){WorkCompletedCallBack callback =TestCallBack;// Notice that I am referencing a method without its parameterDoWork(callback);}publicvoidTestCallBack(string result){Console.WriteLine(result);}
Im heutigen C # könnte dies mit Lambda wie folgt erfolgen:
Ein Rückruf ist ausführbarer Code, der als Argument an anderen Code übergeben wird.
Implementierung
// Parent can ReadpublicclassParent{publicstringRead(){/*reads here*/};}// Child need InfopublicclassChild{privatestring information;// declare a DelegatedelegatestringGetInfo();// use an instance of the declared DelegatepublicGetInfoGetMeInformation;publicvoidObtainInfo(){// Child will use the Parent capabilities via the Delegate
information =GetMeInformation();}}
Verwendung
ParentPeter=newParent();ChildJohny=newChild();// Tell Johny from where to obtain infoJohny.GetMeInformation=Peter.Read;Johny.ObtainInfo();// here Johny 'asks' Peter to read
hi @serhio danke für deine antwort. Für mich ist es immer noch ein wenig trübe: Wo genau wird der Code als Argument an einen anderen Code übergeben? Scheint das Hinzufügen der Peter.Read-Methode zum Delegierten des Kindes zu sein?
BKSpurgeon
1
@serhio Link ist tot.
Judas
10
Ein Rückruf ist ein Funktionszeiger, den Sie an eine andere Funktion übergeben. Die von Ihnen aufgerufene Funktion ruft die andere Funktion zurück, wenn sie abgeschlossen ist.
Ein Rückruf kann als Delegat einer Methode implementiert werden. Sie können jedoch auch sagen, dass das Übergeben eines Objekts, das eine Rückrufmethode auf seiner Schnittstelle unterstützt, ein Rückruf ist.
Joe
Array.Sort (arrayObject); Das Aufrufen von obj.CompareTo (anotherObj) für Elemente von arrayObject ist ein klassisches Beispiel für den Rückruf mithilfe der Schnittstelle (ICompareable) in .Net.
Ron5504
8
Wenn Sie sich auf ASP.Net-Rückrufe beziehen:
Im Standardmodell für ASP.NET-Webseiten interagiert der Benutzer mit einer Seite und klickt auf eine Schaltfläche oder führt eine andere Aktion aus, die zu einem Postback führt. Die Seite und ihre Steuerelemente werden neu erstellt, der Seitencode wird auf dem Server ausgeführt und eine neue Version der Seite wird im Browser gerendert. In einigen Situationen ist es jedoch hilfreich, Servercode vom Client aus auszuführen, ohne ein Postback durchzuführen. Wenn das Client-Skript auf der Seite einige Statusinformationen (z. B. lokale Variablenwerte) verwaltet, wird dieser Status durch das Posten der Seite und das Abrufen einer neuen Kopie zerstört. Darüber hinaus führen Seiten-Postbacks zu einem Verarbeitungsaufwand, der die Leistung verringern und den Benutzer dazu zwingen kann, auf die Verarbeitung und Neuerstellung der Seite zu warten.
Um zu vermeiden, dass der Clientstatus verloren geht und kein Verarbeitungsaufwand für einen Server-Roundtrip anfällt, können Sie eine ASP.NET-Webseite so codieren, dass Client-Rückrufe ausgeführt werden können. Bei einem Client-Rückruf sendet eine Client-Skript-Funktion eine Anforderung an eine ASP.NET-Webseite. Auf der Webseite wird eine geänderte Version ihres normalen Lebenszyklus ausgeführt. Die Seite wird initiiert und ihre Steuerelemente und andere Mitglieder werden erstellt. Anschließend wird eine speziell gekennzeichnete Methode aufgerufen. Die Methode führt die von Ihnen codierte Verarbeitung durch und gibt dann einen Wert an den Browser zurück, der von einer anderen Client-Skriptfunktion gelesen werden kann. Während dieses Vorgangs befindet sich die Seite im Browser.
Rückrufe sind häufig Delegaten an Methoden, die aufgerufen werden, wenn die bestimmte Operation abgeschlossen ist oder eine Unteraktion ausführt. Sie finden sie häufig in asynchronen Vorgängen. Es ist ein Programmierprinzip, das Sie in fast jeder Codierungssprache finden können.
classCallBackExample{publicdelegatevoidMyNumber();publicstaticvoidCallMeBack(){Console.WriteLine("He/She is calling you. Pick your phone!:)");Console.Read();}publicstaticvoidMetYourCrush(MyNumber number){int j;Console.WriteLine("is she/he interested 0/1?:");var i =Console.ReadLine();if(int.TryParse(i,out j)){var interested =(j ==0)?false:true;if(interested)//event{//call his/her number
number();}else{Console.WriteLine("Nothing happened! :(");Console.Read();}}}staticvoidMain(string[] args){MyNumber number =Program.CallMeBack;Console.WriteLine("You have just met your crush and given your number");MetYourCrush(number);Console.Read();Console.Read();}}
Code Erläuterung:
Ich habe den Code erstellt, um die lustige Erklärung von LightStriker in der obigen Antwort zu implementieren. Wir übergeben delegate (number) an eine method ( MetYourCrush). Wenn das Interessierte (Ereignis) in der Methode () auftritt, MetYourCrushruft es den Delegaten (Nummer) auf, der die Referenz der CallMeBackMethode enthielt. Die CallMeBackMethode wird also aufgerufen. Grundsätzlich übergeben wir den Delegaten, um die Rückrufmethode aufzurufen.
Bitte lassen Sie mich wissen, wenn Sie Fragen haben.
Dies beantwortet die Frage nicht angemessen. Können Sie erklären, was Ihr Code tut, um zu beschreiben, wie ein Rückruf funktioniert und wie er in C # implementiert ist?
Adam
Hallo Adam, Danke für deine Antwort. Ich habe den Code erstellt, um die lustige Erklärung von LightStriker zu implementieren. Wir übergeben den Delegaten (Nummer) an eine Methode (MetYourCrush). Wenn das Interessierte (Ereignis) in der Methode (MetYourCrush) auftritt, ruft es den Delegaten (Nummer) auf, der die Referenz der CallMeBack-Methode enthielt. Daher wird die CallMeBack-Methode aufgerufen. Grundsätzlich übergeben wir den Delegaten, um die Rückrufmethode aufzurufen. Bitte lassen Sie mich wissen, wenn Sie Fragen haben.
Mani
1
Wahrscheinlich nicht die Wörterbuchdefinition, aber ein Rückruf bezieht sich normalerweise auf eine Funktion, die außerhalb eines bestimmten Objekts liegt, gespeichert und dann auf ein bestimmtes Ereignis aufgerufen wird.
Ein Beispiel könnte sein, dass beim Erstellen einer UI-Schaltfläche ein Verweis auf eine Funktion gespeichert wird, die eine Aktion ausführt. Die Aktion wird von einem anderen Teil des Codes ausgeführt. Wenn jedoch die Taste gedrückt wird, wird der Rückruf aufgerufen und die auszuführende Aktion aufgerufen.
C # verwendet nicht den Begriff "Rückruf", sondern "Ereignisse" und "Delegierte". Weitere Informationen zu Delegierten finden Sie hier .
Mit einem Rückruf können Sie ausführbaren Code als Argument an anderen Code übergeben. In C und C ++ wird dies als Funktionszeiger implementiert. In .NET würden Sie einen Delegaten verwenden, um Funktionszeiger zu verwalten.
Einige Anwendungen umfassen die Fehlersignalisierung und die Steuerung, ob eine Funktion funktioniert oder nicht.
1) Klicken Sie im UI-Aufruf Onclient auf Javascript-Funktion für EX aufrufen: - builpopup(p1,p2,p3...)
var finalfield = p1, p2, p3;
UseCallBack(finalfield, ""); Daten vom Client werden mithilfe von UseCallBack an den Server übergeben
2) public void RaiseCallbackEvent(string eventArgument) In eventArgument erhalten wir die übergebenen Daten // führen eine serverseitige Operation durch und übergeben sie an "callbackResult"
3) GetCallbackResult() // Mit dieser Methode werden Daten an die Client-Seite (ReceiveServerData () -Funktion) übergeben
callbackResult
4) Holen Sie sich die Daten auf der Clientseite:
ReceiveServerData(text) In der Antwort des Textservers erhalten wir.
Delegaten machen dasselbe wie schnittstellenbasierte Rückrufe in C ++ (COM verwendet diese), obwohl sie viel einfacher zu verwenden sind.
Beachten Sie, dass Microsoft Delegierte in seine Java-Implementierung (J ++) aufgenommen hat, Sun sie jedoch nicht mag [java.sun.com]. Erwarten Sie daher nicht, sie bald in der offiziellen Java-Version zu sehen. Ich habe einen Präprozessor gehackt, damit Sie sie in C ++ verwenden können. Fühlen Sie sich also nicht ausgeschlossen, wenn Sie nicht in C # oder auf der .NET-Plattform (dh in Managed C ++ oder Visual Basic.NET) programmieren.
Wenn Sie es gewohnt sind, Zeiger in C zu funktionieren, ist ein Delegat im Grunde ein Paar von Zeigern, die in einem zusammengefasst sind:
Ein Zeiger auf ein Objekt (optional)
Ein Zeiger auf eine Methode dieses Objekts
Das bedeutet, dass ein einzelner Delegat alle Informationen übergibt, die zum Auffinden einer Funktion in Ihrem Programm erforderlich sind, unabhängig davon, ob es sich um eine statische Methode handelt oder einem Objekt zugeordnet ist.
Sie definieren sie wie folgt in C #:
publicdelegatevoidFooCallbackType(int a,int b,int c );
Wenn Sie sie verwenden möchten, machen Sie aus der Funktion, die Sie aufrufen möchten, einen Delegaten:
classCMyClass{publicvoidFunctionToCall(int a,int b,int c ){// This is the callback}publicvoidFoo(){FooCallbackType myDelegate =newFooCallbackType(this.FunctionToCall);// Now you can pass that to the function// that needs to call you back.}}
Wenn Sie einen Delegaten dazu bringen möchten, auf eine statische Methode zu verweisen, sieht es genauso aus:
classCMyClassWithStaticCallback{publicstaticvoidStaticFunctionToCall(int a,int b,int c ){// This is the callback}publicstaticvoidFoo(){FooCallbackType myDelegate =newFooCallbackType(CMyClass.StaticFunctionToCall);}}
Alles in allem tun sie dasselbe wie schnittstellenbasierte Rückrufe in C ++, verursachen jedoch etwas weniger Probleme, da Sie sich nicht um die Benennung Ihrer Funktionen oder das Erstellen von Hilfsobjekten kümmern müssen und aus jeder Methode Delegaten erstellen können. Sie sind flexibler.
Antworten:
C # hat zu diesem Zweck Delegierte . Sie werden häufig bei Ereignissen verwendet , da ein Ereignis automatisch eine Reihe von angehängten Delegaten (Ereignishandlern) aufrufen kann.
quelle
Ich habe dich gerade getroffen,
und das ist verrückt,
aber hier ist meine Nummer (Delegierter).
Wenn also etwas passiert (Ereignis),
ruf mich vielleicht an (Rückruf)?
quelle
Ein Rückruf ist eine Funktion, die aufgerufen wird, wenn ein Prozess eine bestimmte Aufgabe ausführt.
Die Verwendung eines Rückrufs erfolgt normalerweise in asynchroner Logik.
Um einen Rückruf in C # zu erstellen, müssen Sie eine Funktionsadresse in einer Variablen speichern. Dies wird mit einer
delegate
oder der neuen Lambda-SemantikFunc
oder erreichtAction
.Im heutigen C # könnte dies mit Lambda wie folgt erfolgen:
quelle
Definition
Implementierung
Verwendung
Links
quelle
Ein Rückruf ist ein Funktionszeiger, den Sie an eine andere Funktion übergeben. Die von Ihnen aufgerufene Funktion ruft die andere Funktion zurück, wenn sie abgeschlossen ist.
Schauen Sie sich diesen Link an.
quelle
Wenn Sie sich auf ASP.Net-Rückrufe beziehen:
Quelle: http://msdn.microsoft.com/en-us/library/ms178208.aspx
Wenn Sie sich auf Rückrufe im Code beziehen:
Rückrufe sind häufig Delegaten an Methoden, die aufgerufen werden, wenn die bestimmte Operation abgeschlossen ist oder eine Unteraktion ausführt. Sie finden sie häufig in asynchronen Vorgängen. Es ist ein Programmierprinzip, das Sie in fast jeder Codierungssprache finden können.
Weitere Informationen finden Sie hier: http://msdn.microsoft.com/en-us/library/ms173172.aspx
quelle
Widmung an LightStriker:
Beispielcode:
Code Erläuterung:
Ich habe den Code erstellt, um die lustige Erklärung von LightStriker in der obigen Antwort zu implementieren. Wir übergeben delegate (number) an eine method (
MetYourCrush
). Wenn das Interessierte (Ereignis) in der Methode () auftritt,MetYourCrush
ruft es den Delegaten (Nummer) auf, der die Referenz derCallMeBack
Methode enthielt. DieCallMeBack
Methode wird also aufgerufen. Grundsätzlich übergeben wir den Delegaten, um die Rückrufmethode aufzurufen.Bitte lassen Sie mich wissen, wenn Sie Fragen haben.
quelle
Wahrscheinlich nicht die Wörterbuchdefinition, aber ein Rückruf bezieht sich normalerweise auf eine Funktion, die außerhalb eines bestimmten Objekts liegt, gespeichert und dann auf ein bestimmtes Ereignis aufgerufen wird.
Ein Beispiel könnte sein, dass beim Erstellen einer UI-Schaltfläche ein Verweis auf eine Funktion gespeichert wird, die eine Aktion ausführt. Die Aktion wird von einem anderen Teil des Codes ausgeführt. Wenn jedoch die Taste gedrückt wird, wird der Rückruf aufgerufen und die auszuführende Aktion aufgerufen.
C # verwendet nicht den Begriff "Rückruf", sondern "Ereignisse" und "Delegierte". Weitere Informationen zu Delegierten finden Sie hier .
quelle
Mit einem Rückruf können Sie ausführbaren Code als Argument an anderen Code übergeben. In C und C ++ wird dies als Funktionszeiger implementiert. In .NET würden Sie einen Delegaten verwenden, um Funktionszeiger zu verwalten.
Einige Anwendungen umfassen die Fehlersignalisierung und die Steuerung, ob eine Funktion funktioniert oder nicht.
Wikipedia
quelle
Rückruf-Arbeitsschritte:
1) Wir müssen
ICallbackEventHandler
Interface implementieren2) Registrieren Sie das Client-Skript:
1) Klicken Sie im UI-Aufruf Onclient auf Javascript-Funktion für EX aufrufen: -
builpopup(p1,p2,p3...)
var finalfield = p1, p2, p3;
UseCallBack(finalfield, "");
Daten vom Client werden mithilfe von UseCallBack an den Server übergeben2)
public void RaiseCallbackEvent(string eventArgument)
In eventArgument erhalten wir die übergebenen Daten // führen eine serverseitige Operation durch und übergeben sie an "callbackResult"3)
GetCallbackResult()
// Mit dieser Methode werden Daten an die Client-Seite (ReceiveServerData () -Funktion) übergebencallbackResult
4) Holen Sie sich die Daten auf der Clientseite:
ReceiveServerData(text)
In der Antwort des Textservers erhalten wir.quelle
Delegaten machen dasselbe wie schnittstellenbasierte Rückrufe in C ++ (COM verwendet diese), obwohl sie viel einfacher zu verwenden sind.
Beachten Sie, dass Microsoft Delegierte in seine Java-Implementierung (J ++) aufgenommen hat, Sun sie jedoch nicht mag [java.sun.com]. Erwarten Sie daher nicht, sie bald in der offiziellen Java-Version zu sehen. Ich habe einen Präprozessor gehackt, damit Sie sie in C ++ verwenden können. Fühlen Sie sich also nicht ausgeschlossen, wenn Sie nicht in C # oder auf der .NET-Plattform (dh in Managed C ++ oder Visual Basic.NET) programmieren.
Wenn Sie es gewohnt sind, Zeiger in C zu funktionieren, ist ein Delegat im Grunde ein Paar von Zeigern, die in einem zusammengefasst sind:
Das bedeutet, dass ein einzelner Delegat alle Informationen übergibt, die zum Auffinden einer Funktion in Ihrem Programm erforderlich sind, unabhängig davon, ob es sich um eine statische Methode handelt oder einem Objekt zugeordnet ist.
Sie definieren sie wie folgt in C #:
Wenn Sie sie verwenden möchten, machen Sie aus der Funktion, die Sie aufrufen möchten, einen Delegaten:
Wenn Sie einen Delegaten dazu bringen möchten, auf eine statische Methode zu verweisen, sieht es genauso aus:
Alles in allem tun sie dasselbe wie schnittstellenbasierte Rückrufe in C ++, verursachen jedoch etwas weniger Probleme, da Sie sich nicht um die Benennung Ihrer Funktionen oder das Erstellen von Hilfsobjekten kümmern müssen und aus jeder Methode Delegaten erstellen können. Sie sind flexibler.
quelle