Les délégués et les Rappels
Le terme de rappel dans le contexte des délégués veux dire ,"un délégué déléguant il travaille à un autre délégué afin de terminer une tâche" ?
Exemple 🙁Basé sur ma compréhension,j'ai mis en place un callback,corrigez-moi si c'est mal)
namespace Test
{
public delegate string CallbackDemo(string str);
class Program
{
static void Main(string[] args)
{
CallbackDemo handler = new CallbackDemo(StrAnother);
string substr = Strfunc(handler);
Console.WriteLine(substr);
Console.ReadKey(true);
}
static string Strfunc(CallbackDemo callback)
{
return callback("Hello World");
}
static string StrAnother(string str)
{
return str.Substring(1, 3).ToString();
}
}
}
Veuillez donner des exemples si nécessaire.
- à mon humble avis précieux de penser à un Délégué comme un Type qui est un pointeur de fonction à une Méthode : comme une Interface ou une Classe : c'est un modèle pour une instance qui est lui-même une référence à sa Méthode interne : l'instance peut être passés entre les objets et les invoquées/exécuté à tout moment. Si vous avez une façon d'obtenir de "C# en Profondeur", de Jon Skeet, et de lire le chapitre 2 de la section sur les Délégués, et le Chapitre 5 sur les Délégués, à mon humble avis, vous comprendrez l ' "évolution" des délégués de leur "stade larvaire" en C# 1.0, complètement "évolué" forme en C# 3.0. Je n'ai jamais trouvé une meilleure exposition
Vous devez vous connecter pour publier un commentaire.
Votre exemple est un bon début, mais c'est incorrect. Vous ne faites pas un nouveau délégué à la méthode, il est utilisé dans la déclaration d'un événement dans la classe. Voir ce modifiés exemple de votre code:
J'ai seulement effleuré la surface; la recherche d'un débordement de pile de "délégué c#" et "lambda expression de c#" pour beaucoup plus!
Un rappel est ce que le délégué s'exécute lorsqu'elle est invoquée. Par exemple, lors de l'utilisation du modèle Asynchrone à l'aide de délégués, vous voulez faire quelque chose comme ceci:
OnMessageReceived
est le rappel, le code qui est exécuté en invoquant le délégué. Voir cet article de Wikipédia pour plus d'information, ou Google quelques exemples de plus.Un rappel est fondamentalement un délégué passé dans une procédure que la procédure de "rappel" à un certain point. Par exemple, dans des appels asynchrones tels que WebRequest.BeginGetResponse ou un WCF BeginXxx opération, vous souhaitez passer un AsyncCallback. Le travailleur "call back" quelle que soit la méthode que vous passer dans le AsyncCallback, dans ce cas, lorsque c'est fini pour vous laisser savoir que c'est fini et pour obtenir le résultat.
Un gestionnaire d'événement peut être considéré comme un autre exemple. Par exemple, lorsque vous attacher un gestionnaire à un événement de Clic, le bouton "call-back" pour que le gestionnaire lorsque le clic se produit.
Cela va descendre voté précisément pour la raison qu'il est correct. C# ne pas mettre en œuvre les délégués, ce qu'il met en œuvre est le transfert d'appel. Cette mauvaise utilisation de la nomenclature est probablement le plus grand problème avec C# à cet égard.
L'ACM document ci-dessous est la première description de ce que serait plus tard appelé un délégué. Fondamentalement, un délégué est quelque chose qui semble être une instance d'un objet (comment il est réellement mis en œuvre est sans importance). Cela signifie que vous pouvez appeler les méthodes, les propriétés d'accès, etc. du délégué.
http://web.media.mit.edu/~lieber/Lieberary/OOP/Delegation/Delegation.html
Ce que le C# met en place est de rappels ou de renvoi d'appel (tout dépend de la façon dont vous les utilisez). Ce ne sont pas des délégués. Afin d'être un délégué d'être en mesure d'accéder à l'objet comme s'il était l'objet lui-même.
Alors, comment at-il foiré? Pour être honnête, je ne sais pas. Je sais que j'ai été en utilisant les délégués (plus de 16 ans maintenant) longtemps avant de C# et de ce que C# met en œuvre ne sont pas délégués.
Une très bonne explication peut être eu ici.
http://www.saturnflyer.com/blog/jim/2012/07/06/the-gang-of-four-is-wrong-and-you-dont-understand-delegation/
Réel délégation est plus que de créer des rappels ou le transfert d'appel. Un véritable délégué me permet d'appeler n'importe quelle méthode sur cet objet, d'obtenir et/ou un ensemble de propriétés publiques, etc - tout comme si elle était l'objet lui-même. C'est beaucoup plus puissant et le plus facile à utiliser que le C# "délégation".
L'OP demandé:
La réponse à cette question est oui. Un rappel dans le contexte des délégués peut ne peut être utilisé pour terminer une tâche. Par exemple, vous avez une classe qui obtiennent des données à partir d'un site météo. Car il est non-déterministe, la mise en œuvre d'un rappel lorsque les données ont été reçues (et peut-être analysé) serait chic.
Pourquoi la délégation a été corrompu, je n'en ai aucune idée. J'ai hâte de C# en œuvre une VRAIE délégation.