it-swarm.com.de

Sind Delegierte und Rückrufe gleich oder ähnlich?

Sind Delegierte dasselbe wie Rückrufe? Oder sind sie irgendwie verwandt?

48
ASDFQWERTY

Ein "Rückruf" ist ein Begriff, der sich auf ein Codierungsmuster bezieht, das in jeder Sprache verfügbar ist, die Funktionszeiger enthält, oder ein Analogon zu Funktionszeigern (was ein Delegierter ist). 

In diesem Muster übergeben Sie einen Zeiger auf eine Funktion an eine andere Funktion, so dass sie innerhalb der aufgerufenen Funktion die an sie übergebene Funktion "zurückrufen" kann. Auf diese Weise können Sie einen großen Teil des internen Verhaltens einer Methode von außerhalb der Methode steuern, indem Sie bei jedem Aufruf der Funktion Zeiger auf eine andere Callback-Funktion übergeben. Ein Beispiel für einen Callback ist der Sortieralgorithmus Dazu muss ein Zeiger auf eine Funktion übergeben werden, die ein beliebiges Objektpaar in der zu sortierenden Liste "vergleicht", um zu ermitteln, welches Objekt vor dem anderen liegt. Bei einem Aufruf der Sortiermethode können Sie eine Rückruffunktion übergeben, die den Objektnamen vergleicht, und ein anderes Mal eine Funktion übergeben, die die Objektgewichtung vergleicht oder was auch immer.

Ein Delegat, otoh, ist ein bestimmter .Net-Typ, der als signaturspezifischer Container für einen Funktionszeiger fungiert ... In verwaltetem Code von .Net sind Delegaten die einzige Möglichkeit, einen Funktionszeiger zu erstellen und zu verwenden. In .Net passieren Sie für einen Rückruf tatsächlich einen Delegierten ... Aber Delegierte können in anderen Szenarien neben den Rückrufen verwendet werden. (Insbesondere können Delegaten auch verwendet werden, um Multithreading aus dem .Net-Thread-Pool zu implementieren.)

Callbacks werden auch verwendet, um das "Observer" -Muster zu implementieren (in .NET implementiert, wobei Events verwendet werden, die selbst eine besondere Art von Delegaten sind).

31
Charles Bretana

(Ich gehe davon aus, dass Sie hier von .NET sprechen. Wenn nicht, gehen Sie bitte näher darauf ein.)

Delegierte sind die idiomatische Art, Callbacks in .NET zu implementieren - aber Sie müssen dies nicht. Sie können beispielsweise eine Schnittstelle verwenden. (Insbesondere können Sie dann einen Rückruf mit einer Methode aufrufen, um bei Fehlern aufzurufen, und eine über Erfolg. Natürlich können Sie stattdessen auch zwei Delegierte verwenden ...)

Es gibt viele Verwendungsmöglichkeiten für Delegaten, die über Callbacks in .NET hinausgehen. Dies hängt davon ab, was genau Sie für einen Rückruf halten, aber GUI-Ereignishandler, Thread-Starter, Filter und Projektionen (und mehr!) In LINQ to Objects verwenden alle Delegaten.

15
Jon Skeet

im Allgemeinen ist ein Delegat ein Objekt, das für den Zugriff auf eine Methode außerhalb des Objekts, das die Methode besitzt, verwendet wird, während ein Rückruf eine Variable ist, die einen Delegaten enthält

in C # werden die Begriffe austauschbar verwendet

4
Steven A. Lowe

Sie sind Hand in Hand. Ein Delegat beschreibt, wie die Rückruffunktion aussehen soll:

delegate void MyDelegate(string Text);

Dann können Sie eine Funktion haben, die den Callback als Parameter übernimmt.

//This will result in a MessageBox with "Lalalala"
MyFunctionThatGetsTheCallbackFunctionRef(MyCallBackFunc); 

void MyFunctionThatGetsTheCallbackFunctionRef(MyDelegate TheFunction){
 TheFunction("Lalalala");
}

void MyCallBackFunc(string Text){
  //my callback
  MessageBox.Show(Text);
}
4
Wolf5

Die Serviceklasse verfügt über eine variable Funktion, die als Delegat bezeichnet wird. Die aufrufende Klasse hat eine bevorzugte Funktion, die ausgeführt werden soll und als Callback bezeichnet wird.

Die aufrufende Klasse setzt den Delegaten auf seinen Rückruf.

Der Unterschied zwischen einem Delegaten und einem Rückruf ist die Perspektive: Die Serviceklasse ruft den Delegaten auf, der für den Callback der aufrufenden Klassen festgelegt ist.

0
Watachiaieto