IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dotnet Discussion :

Instanciation d'un delegate


Sujet :

Dotnet

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    958
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 958
    Points : 141
    Points
    141
    Par défaut Instanciation d'un delegate
    Bonjour,

    Soit le code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
     // Declare a delegate.
        delegate void Printer(string s);
     
        class TestClass
        {
            static void Main()
            {
                // Instantiate the delegate type using an anonymous method.
                Printer p = delegate(string j)
                {
                    System.Console.WriteLine(j);
                };
     
                // Results from the anonymous delegate call.
                p("The delegate using the anonymous method is called.");
     
                // The delegate instantiation using a named method "DoWork".
                p = new Printer(TestClass.DoWork);
     
                // Results from the old style delegate call.
                p("The delegate using the named method is called.");
            }
     
            // The method associated with the named delegate.
            static void DoWork(string k)
            {
                System.Console.WriteLine(k);
            }
        }
    Dans ce code, on remarque l'instanciation du delegué Printer par l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      p = new Printer(TestClass.DoWork);
    Si je souhaite ajouter une autre fonction à ce délégué, on fait à nouveau
    p= new Printer(nom d'une autre fonction possédant la signature du delegue Printer).
    Pourquoi refaire new Printer (nom d'une autre fonction possédant la signature du délégué Printer)alors que le délégué est déjà instancié.

    Je vous remercie beaucoup de votre réponse sur ce point.

    Cordialement.

    Bons voeux pour l'année 2017.

    new_wave
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Tout d'abord, tu n'es pas obligé d'instancier (syntaxiquement parlant) un nouveau delegate. Tu peux écrire directement p = TestClass.DoWork cela fonctionnera. Par contre, dans le code généré, cela sera l'équivalent de la syntaxe que tu utilises, à savoir avec l'instanciation explicite new Printer.

    Maintenant, pourquoi est-il nécessaire de faire une nouvelle instanciation ? La réponse est simple : un delegate n'est pas un simple pointeur de fonction. Un delegate peut contenir plusieurs références qui seront toutes appelées lorsque tu appeleras le delegate. Pour t'en convaincre, change la ligne p = new Printer(TestClass.DoWork); par p += new Printer(TestClass.DoWork); et tu pourras constater que :
    1. ça compile ;
    2. à l'exécution, lorsque le delegate est appelée, les deux méthodes enregistrées sont appelées.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    958
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 958
    Points : 141
    Points
    141
    Par défaut instanciation d'un delegate
    Bonjour et merci de votre réponse.

    Si j'ai bien compris celle-ci , un delegate reférence plusieurs instances de ce délégué qui chacune pointe vers une méthode .

    Peut-on dire, par abus de langage, qu'une méthode pointée par un delegate est un delegate elle-même.

    Vous remerciant encore de votre réponse et vous souhaitant une bonne année,

    Bien cordialement.

    new_wave
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par new_wave Voir le message
    Si j'ai bien compris celle-ci , un delegate reférence plusieurs instances de ce délégué qui chacune pointe vers une méthode .
    Non, un delegate contient la référence d'une ou plusieurs méthodes.

    Citation Envoyé par new_wave Voir le message
    Peut-on dire, par abus de langage, qu'une méthode pointée par un delegate est un delegate elle-même.
    Par abus de langage, et vu le lien fort entre delegate et pointeur de fonction, on fait souvent l'amalgame entre les deux. La grosse différence réside dans le fait qu'un pointeur de fonction ne pointe que sur une fonction, tandis qu'un delegate peut pointer sur plusieurs fonctions.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    958
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 958
    Points : 141
    Points
    141
    Par défaut instanciation d'un delegate
    Bonjour et merci de ta réponse.

    D'après la réponse que tu me donnes, à chaque fois q'un delegate va référencer une nouvelle méthode on le réinitialise(on refait un new) avec en argument le nom de la méthode pointée.

    Mais ce qui m'est encore difficile à comprendre c'est pourquoi est -il besoin de le réinitialiser?
    Est-ce que la référence créée par le new est l'adresse de la fonction pointée?

    Merci beaucoup de votre réponse.

    Bien cordialement.

    new_wave
    Il vaut mieux mobiliser son intelligence sur des conneries que mobiliser sa connerie sur des choses intelligentes. [SHADOKS]

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par new_wave Voir le message
    à chaque fois q'un delegate va référencer une nouvelle méthode on le réinitialise(on refait un new) avec en argument le nom de la méthode pointée.
    La bonne terminologie n'est pas "réinitialiser" mais "instancier" (on créé un objet).

    Citation Envoyé par new_wave Voir le message
    Est-ce que la référence créée par le new est l'adresse de la fonction pointée?
    Non. Et c'est peut être pour cela que tu ne comprends pas pouquoi il est nécessaire de réinstancier l'objet. Un delegate "encapsule" l'adresse de la fonction pointée, mais n'est en aucun cas l'adresse de la fonction pointée.

    Et comme je te l'ai dit plus haut, un delegate n'est pas un pointeur de fonction, mais une collection de pointeurs de fonction. C'est loin d'être la même chose.

    Citation Envoyé par new_wave Voir le message
    Mais ce qui m'est encore difficile à comprendre c'est pourquoi est -il besoin de le réinitialiser?
    Car c'est ainsi que fonctionne les delegate. Difficile de donner une autre réponse.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. [Reflection] Instancier un objet
    Par bl@st dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 28/10/2008, 11h09
  2. [POO] Instancier un objet avec le nom de la classe
    Par shinchun dans le forum Langage
    Réponses: 4
    Dernier message: 08/06/2006, 13h44
  3. [JAR] instancier une Image contenue dans un jar
    Par celine31 dans le forum Général Java
    Réponses: 3
    Dernier message: 03/04/2005, 15h55
  4. [Débutant(e)]servlet qui instancie une classe personelle
    Par NiBicUs dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 08/02/2005, 12h00
  5. [VB.NET] Instanciation objet (sur class perso.)
    Par DaxTaz dans le forum ASP.NET
    Réponses: 4
    Dernier message: 03/05/2004, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo