7
votes

Utilisations des délégués en C # (ou dans d'autres langues)

Je me suis toujours demandé comment les délégués peuvent être utiles et pourquoi allons-nous les utiliser? Autre puis étant de type sécuritaire et tous ces avantages de la documentation Visual Studio, quelles sont les utilisations du monde réel des délégués.

J'en ai déjà trouvé un et c'est très ciblé. P>

using System;

namespace HelloNamespace {

    class Greetings{
    public static void DisplayEnglish() {
            Console.WriteLine("Hello, world!");
    }
    public static void DisplayItalian() {
             Console.WriteLine("Ciao, mondo!");
    }
    public static void DisplaySpanish() {
             Console.WriteLine("Hola, imundo!");
         }
    }

    delegate void delGreeting();

    class HelloWorld {
        static void Main(string [] args) {

    int iChoice=int.Parse(args[0]);
    delGreeting [] arrayofGreetings={
             new delGreeting(Greetings.DisplayEnglish),
             new delGreeting(Greetings.DisplayItalian),
             new delGreeting(Greetings.DisplaySpanish)};

    arrayofGreetings[iChoice-1]();
         }
    }
}


3 commentaires

Ah, c'est le premier exemple de Visual C # 2008 de Donis Marshall ... pas vraiment un exemple de premier bonjour approprié, mais néanmoins ...


Non, je l'ai trouvé sur "Programmation Microsoft Visual C # 2005: la langue" du même auteur, bien qu'il a fait une nouvelle édition pour C # 2008, je vais avoir un coup d'oeil à cela


Vous venez d'ouvrir la boîte de Pandora :)


11 Réponses :


5
votes

Les délégués sont un excellent moyen de injection de fonctionnalité dans une méthode. Ils aident grandement avec code de code à cause de cela.

Pensez-y, disons que vous avez un groupe de méthodes connexes qui ont presque la même fonctionnalité, mais varient de quelques lignes de code. Vous pouvez refacturer toutes les choses que ces méthodes sont communes en une seule méthode, alors vous pourriez injecter la fonctionnalité spécialisée dans la via un délégué.

Prenons par exemple toutes les méthodes d'extension iEnumérables utilisées par LINQ. Tous définissent des fonctionnalités courantes, mais ont besoin d'un délégué qui leur transmettait la manière dont les données de retour sont projetées ou comment les données sont filtrées, triées, etc.


0 commentaires

5
votes

L'utilisation quotidienne du monde réel le plus courant des délégués que je peux penser à C # serait une manipulation des événements. Lorsque vous avez un bouton sur une winform, vous souhaitez faire quelque chose lorsque vous cliquez sur le bouton, vous devez vous retrouver à enregistrer une fonction de délégation à appeler par le bouton lorsqu'il est cliqué sur.

Tout cela se produit pour vous automatiquement dans les coulisses du code généré par Visual Studio lui-même, de sorte que vous ne voyez peut-être pas où cela se produit.

Un cas réel qui pourrait être plus utile pour vous serait si vous souhaitiez faire une bibliothèque que les personnes peuvent utiliser qui lira des données sur une alimentation Internet et les notifiera lorsque le flux a été mis à jour. En utilisant des délégués, les programmeurs utilisant votre bibliothèque pourraient avoir leur propre code appelé chaque fois que l'alimentation est mise à jour.


2 commentaires

comme exemple du monde réel; J'ai eu une classe qui a écrit des fichiers à un CD, sans délégués que le seul moyen d'informer qu'un utilisateur aurait été d'interrompre le processus, mais avec des délégués, je pouvais soulever un événement permettant au programme d'appel de gérer les notifications sans avoir à ajouter Toutes sortes de dépendances dans ma classe d'écriture de CD.


Vous voudrez faire attention lorsque vous appelez des événements de votre classe, car ceux-ci sont exécutés sur le même thread et peuvent finir par bloquer votre classe de faire ce que vous voulez faire! Je ne sais pas si la gravure de CD est toujours une opération sensible au temps, mais si vous souhaitez que vous envisagez de changer vos événements pour tirer sur leur propre fil indépendant.



4
votes

Expressions Lambda
Les délégués étaient principalement utilisés conjointement avec des événements. Mais les langues dynamiques ont montré leur utilisation beaucoup plus large. C'est pourquoi les délégués ont été sous-utilisés jusqu'au C # 3.0 lorsque nous avons obtenu Lambda Expressions . Il est très facile de faire quelque chose à l'aide d'expressions Lambda (qui génère une méthode de délégation)

Maintenant, imaginez que vous avez une iénumérable de cordes. Vous pouvez facilement définir un délégué (en utilisant l'expression de Lambda ou toute autre manière) et appliquez-la pour exécuter sur chaque élément (comme couper l'excès d'espaces par exemple). Et le faire sans utiliser des déclarations de boucle. Bien sûr, vos délégués peuvent faire des tâches encore plus complexes.


0 commentaires

1
votes

Les délégués sont utilisés pour "appeler" code dans d'autres classes (ce qui pourrait ne pas être nécessairement dans la même classe, la classe ou .cs ou même le même assemblage).

Dans votre exemple, les délégués peuvent simplement être remplacés par des déclarations comme si vous avez souligné.

Toutefois, les délégués sont des indexateurs sur des fonctions qui "vivent" quelque part dans le code où des raisons organisationnelles semblent par exemple que vous n'avez pas accès à (facilement).


0 commentaires

0
votes

Une autre utilisation que je trouve une excellente aubaine est si je souhaite effectuer la même opération, transmettez les mêmes données ou déclencher la même action dans plusieurs instances du même type d'objet.


0 commentaires

3
votes

Je vais essayer de répertorier quelques exemples qui dépassent un simple scénario si-d'autre:

  1. Mise en œuvre des appels. Par exemple, vous analysez un document XML et vous souhaitez qu'une fonction particulière soit appelée lorsqu'un nœud particulier est rencontré. Vous pouvez transmettre des délégués aux fonctions.

  2. Mise en œuvre du modèle de conception de stratégie. Attribuez le délégué à l'algorithme / mise en œuvre de la stratégie requise.

  3. délégués anonymes dans le cas où vous voulez que certaines fonctionnalités soient exécutées sur un thread séparé (et cette fonction n'a rien à renvoyer au programme principal).

  4. abonnement événement comme suggéré par d'autres.


0 commentaires

2
votes

Dans votre exemple, votre superficielle est la même chose, alors ce que vous avez réellement besoin est une matrice de chaînes.

Si vous aimez utiliser des délégués dans le modèle de commande, imaginez que vous avez: p>

public static void ShakeHands()
{ ... }

public static void HowAreYou()
{ ... }

public static void FrenchKissing()
{ ... }


0 commentaires

0
votes

Dans .NET, les délégués sont également nécessaires lors de la mise à jour de l'interface utilisateur d'un fil d'arrière-plan. Comme vous ne pouvez pas mettre à jour les commandes du fil différent de celui qui a créé les commandes, vous devez appeler le code de mise à jour avec le contexte de la création du thread (principalement en utilisant cela.invoke).


0 commentaires

1
votes

Les délégués et le sucre syntaxique associé ont considérablement changé le monde C # (2.0+) Les délégués sont des pointeurs de fonction de type sécurisé - donc vous utilisez des délégués partout où vous souhaitez appeler / exécuter un bloc de code à un moment futur .

larges sections que je peux penser à < p> Callbacks / Manutes d'événements : Faites-le quand EventX arrive. Ou faites-le lorsque vous êtes prêt avec les résultats de mon appel de méthode Async. xxx

linq : sélection, projection, etc. des éléments où vous voulez faire quelque chose avec chaque élément avant de le transmettre au pipeline. par exemple. Sélectionnez tous les numéros qui sont même, puis renvoient le carré de chacun de ces xxx


0 commentaires

2
votes

Voici un exemple de monde réel. J'utilise souvent des délégués lors de l'enveloppement d'une sorte d'appel externe. Par exemple, nous avons un ancien serveur d'applications (que je souhaite simplement partir) que nous vous connectons à .NET Remoting. Je vais appeler le serveur d'applications dans un délégué à partir d'une fonction "SafeCall" comme ceci: xxx

évidemment, le traitement des erreurs est fait un peu mieux que cela, mais vous obtenez une idée approximative.


0 commentaires

3
votes

Les délégués sont simplement la mise en œuvre de Fonctions de première classe et autorisez les langues à l'aide de Limez-les de fournir Fonctions d'ordre supérieur .

Le principe de ce type de style est que des aspects courants peuvent être résumés dans une fonction qui ne doit pas faire ce qu'elle doit faire (par exemple, traverser une structure de données) et est fournie une autre fonction (ou des fonctions) qu'elle demande. faire quelque chose comme ça va.

Les exemples fonctionnels canoniques sont carte et pli qui peut être modifié pour faire toutes sortes de choses par la fourniture d'une autre opération. < / p>

Si vous souhaitez résumer une liste de T'S et que vous avez une fonction ajoutée qui prend deux t et les ajoute ensemble, puis (via une application partielle) pli ajout 0 devient somme. pli multiplier 1 deviendrait le produit, pli 0 le maximum. Dans tous ces exemples, le programmeur n'a pas besoin de penser à la manière d'itérer sur les données d'entrée, il n'est pas nécessaire de ne pas vous inquiéter de ce qu'il faut faire si l'entrée est vide.

Ce sont des exemples simples (bien qu'ils puissent être étonnamment puissants lorsqu'ils sont combinés avec d'autres) mais considèrent la traversée de l'arbre (une tâche plus complexe) tout cela peut être abstraite derrière un TRANDFOLD fonction. L'écriture de la fonction de pliose de l'arbre peut être difficile, mais une fois terminée, elle peut être réutilisée largement sans avoir à s'inquiéter de bugs.

Ceci est similaire dans le concept et la conception de l'ajout de constructions de boucle de Foreach aux langues impératives traditionnelles, l'idée étant que vous n'avez pas à écrire le contrôle de la boucle vous-même (puisqu'il introduit les chances d'éteindre par une erreur, augmente Verbosité qui gêne ce que vous faites à chaque entrée montrant plutôt comment vous obtenez chaque entrée. Les fonctions d'ordre supérieur vous permettent simplement de séparer la traversée d'une structure de ce à faire lors de la traversée tout en parcourant < fort> extensiblement dans la langue elle-même.

Il convient de noter que les délégués en C # ont été largement remplacés par Lambdas, car le compilateur peut simplement le traiter comme un délégué moins verbeux s'il le souhaite, mais est également libre de passer à travers l'expression la Lambda Représente la fonction qu'il est transmis à la restructuration (souvent complexe) de restructuration (souvent complexe) de la désir dans un autre domaine comme des requêtes de base de données via LINQ-TO-SQL.

Un avantage de principe du modèle de délégué .NET sur les pointeurs de la fonction de style C est qu'ils sont en réalité une tuple (deux pièces de données) la fonction à appeler et l'objet facultatif sur lequel la fonction doit être appelée. Cela vous permet de passer des fonctions avec l'état qui est encore plus puissant. Étant donné que le compilateur peut utiliser ceci pour construire des cours derrière votre dos (1), instancez une nouvelle instance de cette classe et placez les variables locales dans celle-ci, permettant ainsi fermetures .

(1) Il n'est pas les pour toujours faire cela, mais pour le moment, c'est un détail de mise en œuvre


0 commentaires