7
votes

Délégués et rappels

Le terme rappel dans le contexte des délégués signifie-t-il: " un délégué déléguant qu'elle travaille à un autre délégué contenue pour terminer une tâche "?

Exemple: ( basé sur Sur ma compréhension, j'ai mis en place un rappel, corrigez-moi s'il est faux ) xxx

Veuillez fournir des exemples si nécessaire.


1 commentaires

IMHO précieux de penser à un délégué en tant que type un pointeur de fonction sur une méthode: comme une interface ou une classe: c'est un modèle pour une instance qui est elle-même une référence à sa méthode interne: l'instance peut être transmise entre les objets et invoqué / exécuté à tout moment. Si vous avez un moyen de faire la maintien de «C # en profondeur», de Jon Skeet et de lire la section Chapitre 2 sur les délégués et du chapitre 5 des délégués, vous comprendrez l'évolution de la "évolution" des délégués de leur "stade larvaire" en C # 1.0, à leur forme entièrement "évoluée" en C # 3.0. Je n'ai jamais trouvé une meilleure exposition


4 Réponses :


3
votes

Un rappel est essentiellement un délégué adopté dans une procédure que cette procédure "rappellera" à un point approprié. Par exemple, dans des appels asynchrones tels que WebRequest.begingeSePonse ou une opération de WCF Begkexxx, vous passeriez un asynccallback. Le travailleur "rappellera" quelle que soit la méthode que vous passez en tant que asynccallback, dans ce cas où il est fini de vous faire savoir qu'il est fini et d'obtenir le résultat.

Un gestionnaire d'événements pourrait être considéré comme un autre exemple. Par exemple, lorsque vous attachez un gestionnaire à un événement de clic, le bouton "rappellera" sur ce gestionnaire lorsque le clic se produit.


0 commentaires

4
votes

Un rappel est ce que le délégué exécute quand il est invoqué. Par exemple, lors de l'utilisation du motif asynchrone à l'aide de délégués, vous feriez quelque chose comme ceci: xxx

Onmesagereceived est le rappel, le code exécuté en invoquant le délégué . Voir Cet article Wikipedia Pour plus d'informations, ou Google quelques exemples supplémentaires.


0 commentaires

11
votes

Votre exemple est un bon début, mais c'est incorrect. Vous ne faites pas de nouveau délégué dans la méthode, il est utilisé dans la Déclaration d'un événement dans la classe. Voir cet exemple modifié de votre code:

namespace Test
{
    //In this case, this delegate declaration is like specifying a specific kind of function that must be used with events.
    public delegate string CallbackDemo(string str);
    class Program
    {
        public static event CallbackDemo OnFoobared;
        static void Main(string[] args)
        {
            //this means that StrAnother is "subscribing" to the event, in other words it gets called when the event is fired
            OnFoobared += StrAnother;
            string substr = Strfunc();
            Console.WriteLine(substr);
            Console.ReadKey(true);
            //this is the other use of delegates, in this case they are being used as an "anonymous function". 
            //This one takes no parameters and returns void, and it's equivalent to the function declaration 
            //'void myMethod() { Console.WriteLine("another use of a delegate"); }'
            Action myCode = delegate
            {
                Console.WriteLine("another use of a delegate");
            };
            myCode();
            Console.ReadKey(true);
            //the previous 4 lines are equivalent to the following however this is generally what you should use if you can
            //its called a lambda expression but it's basically a way to toss arbitrary code around
            //read more at http://www.developer.com/net/csharp/article.php/3598381/The-New-Lambda-Expressions-Feature-in-C-30.htm or 
            //http://stackoverflow.com/questions/167343/c-lambda-expression-why-should-i-use-this
            Action myCode2 = () => Console.WriteLine("a lambda expression");
            myCode2();
            Console.ReadKey(true);
        }

        static string Strfunc()
        {
            return OnFoobared("a use of a delegate (with an event)");
        }
        static string StrAnother(string str)
        {
            return str.Substring(1, 3).ToString();
        }
    }
}


0 commentaires

2
votes

Ceci sera voté précisément pour la raison pour laquelle il est correct. C # ne met pas en œuvre les délégués, ce que les implements informés sont le transfert d'appel. Cette utilisation incorrecte de la nomenclature est probablement le plus gros problème avec C # à cet égard.

Le papier ACM ci-dessous est la première description de ce qui serait ultérieurement appelé un délégué. Fondamentalement, un délégué est quelque chose qui semble être une instance d'un objet (comment elle est réellement mise en œuvre est hors de propos). Cela signifie que vous pouvez appeler des méthodes, accéder à des propriétés, etc. du délégué.

http://web.media.mit.edu /~lieber/lieberary/oop/odélégation/délégation.html

Qu'est-ce que C # Implements est des rappels ou un transfert d'appel (tous dépendant de la manière dont vous les utilisez). Ce ne sont pas des délégués. Pour être un délégué, il est capable d'accéder à l'objet comme s'il s'agissait de l'objet lui-même.

Lorsqu'un stylo déléguette un message de dessin à un stylo prototypique, il dit "Je ne sais pas comment gérer le message du dessin. J'aimerais que vous répondiez à cela pour moi si vous le pouvez, mais si vous avez d'autres questions, comme quelle est la valeur de ma variable x ou besoin de quelque chose de fait, vous devriez revenir à moi et demander. " Si le message est délégué plus loin, toutes les questions sur les valeurs des variables ou des demandes de réponse aux messages sont tous déduites à l'objet qui déléguait le message en premier lieu. - Henry Lieberman

Alors, comment a-t-il été gâché? Pour être honnête, je ne sais pas. Je sais que j'utilise des délégués (plus de 16 ans maintenant) bien avant que c # et quels instruments C # ne sont pas des délégués.

Une très bonne explication peut être eue ici.

http://www.staturnflyer.com/blog/jim/2012/07/06/Le-gang-of-four-is-wrong-and-you-Dont-understand-Delegation/ < / a>

La vraie délégation est plus que la création de rappels ou de transfert d'appel. Un vrai délégué me permet d'appeler n'importe quelle méthode sur cet objet, d'obtenir et / ou de définir des propriétés publiques, etc., comme si c'était l'objet lui-même. C'est beaucoup plus puissant et plus facile à utiliser, que la "délégation" C #.

L'OP a demandé:

Le terme rappel dans le contexte des délégués signifie-t-il: "Un délégué déléguant qu'elle travaille à un autre délégué inadéquation pour terminer une tâche"?

La réponse à ceci est oui. Un rappel dans le contexte des délégués peut ne peut être que utilisé pour terminer une tâche. Par exemple, vous avez une classe qui obtient des données d'un site météo. Comme il est non déterministe, la mise en œuvre d'un rappel lorsque les données ont été reçues (et peut-être analysées) seraient spiffy.

Pourquoi pourquoi la délégation a été corrompue, je ne sais pas. J'attends avec impatience C # mettre en œuvre la vraie délégation.


0 commentaires