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

Windows Discussion :

c# et delegué


Sujet :

Windows

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 33
    Points : 22
    Points
    22
    Par défaut c# et delegué
    Bonjour,
    j'aurai besoin d'une petite explication sur les delegué voici un morceau de code
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    public class Communication 
    { 
    // déclaration type délégué 
    public delegate int DataReceivedHandler(string data); 
    // variable du type délégué donnée recue 
    public DataReceivedHandler dataReceivedHandler=null; 
    
    // ... 
    
    //----------------------------------------------------------- 
    // traitement d'attente en réception des données 
    // effectué dans une boucle, exécuté par un thread 
    public void RunReceptionData() 
    { 
    string data= null; 
    
    // boucle d'attente 
    while(true) 
    { 
    // donnée en reception 
    // ... remplir variable data 
    
    // appel délégué pour signaler présence donnée recue 
    if( dataReceivedHandler != null) 
    dataReceivedHandler(data); 
    
    // suite traitement ... 
    } 
    } 
    } 
    
    private void Form1_Load(object sender, System.EventArgs e) 
    { 
    // instancie l'objet pour communiquer 
    comm= new Communication(); 
    
    
    // instancie le délégué 
    comm.dataReceivedHandler= new Communication.DataReceivedHandler(this.DonneeRecue); 
    } 
    
    //----------------------------------------------------------- 
    // déclenché par le délégué lorsque une donnée est recue 
    private void DonneeRecue(string data) 
    { 
    // affiche le message recu 
    MessageBox.Show("donnée recue: "+data); 
    }
    c'est juste un code d'exemple il ne compilera pas.Je veux juste une explication en instanciant un delegué a chaque fois
    comm.dataReceivedHandler= new Communication.DataReceivedHandler;
    normalement dataReceivedHandler doit alors chaque fois pointer vers une nouvelle adresse et le garbage collector supprimera la donnée de l'adresse precedante non?Pourquoi dans ce cas cela ne fonctionne pas?
    merci.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Euh... Là, je ne le vois affecté qu'une seule fois, le delegate: Au lancement de la form...

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2006
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 33
    Points : 22
    Points
    22
    Par défaut
    dsl j'ai pris un mauvais code et en plus je viens de me rendre compte que je suis dans la mauvaise section dsl.

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    using System;
    public class class1{
    // définition d'un prototype de fonction
    // accepte 2 entiers en paramètre et rend un entier
    public delegate int opération(int n1, int n2);
    // deux méthodes d'instance correspondant au prototype
    public int ajouter(int n1, int n2){
    Console.Out.WriteLine("ajouter("+n1+","+n2+")");
    return n1+n2;
    }//ajouter
    public int soustraire(int n1, int n2){
    Console.Out.WriteLine("soustraire("+n1+","+n2+")");
    return n1-n2;
    }//soustraire
    // une méthode statique correspondant au prototype
    public static int augmenter(int n1, int n2){
    Console.Out.WriteLine("augmenter("+n1+","+n2+")");
    return n1+2*n2;
    }//augmenter
    // programme de test
    public static void Main(){
    // on définit un objet de type opération pour y enregistrer des fonctions
    // on enregistre la fonction statique augmenter
    opération op=new opération(class1.augmenter);
    // on exécute le délégué
    int n=op(4,7);
    Console.Out.WriteLine("n="+n);
    // création d'un objet c1 de type class1
    class1 c1=new class1();
    // on enregistre dans le délégué la méthode ajouter de c1
    op=new class1.opération(c1.ajouter);
    // exécution de l'objet délégué
    n=op(2,3);
    Console.Out.WriteLine("n="+n);
    // on enregistre dans le délégué la méthode soustraire de c1
    op=new class1.opération(c1.soustraire);
    n=op(2,3);
    Console.Out.WriteLine("n="+n);
    //enregistrement de deux fonctions dans le délégué
    op=new class1.opération(c1.ajouter);
    op+=new class1.opération(c1.soustraire);
    // exécution de l'objet délégué
    op(0,0);
    // on retire une fonction du délégué
    op-=new opération(c1.soustraire);
    // on exécute le délégué
    op(1,1);
    }//Main
    }//classe
    à la fin du code on a
    op=new class1.opération(c1.ajouter);
    op+=new class1.opération(c1.soustraire);
    normalement l'instanciation de op dans la seconde ne devrai pas effacé la seconde.Je comprend pas bien ce mecanisme.je me rends compte qu'il y a un "+=" mais comment va marcher cette opérateur dans cette situation en mémoire?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Les delegates sont "multicast" : Ils peuvent appeler plusieurs fonctions à la suite.
    L'ajout sur un delegate lui ajoute une fonction à appeler, la soustraction retire la fonction. C'est aussi simple que ça.

Discussions similaires

  1. Utilite des delegues ?
    Par topolino dans le forum ASP.NET
    Réponses: 5
    Dernier message: 31/03/2010, 17h51
  2. EventHandler, delegue different ?
    Par topolino dans le forum ASP.NET
    Réponses: 3
    Dernier message: 14/10/2008, 09h25
  3. prb avec methode beginInvoke et delegué
    Par pkboo dans le forum VB.NET
    Réponses: 3
    Dernier message: 19/11/2007, 08h51
  4. Réponses: 4
    Dernier message: 04/07/2006, 09h35
  5. [C#]Evenement DrawItemEventHandler: non passage ds delegué
    Par titounne dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/10/2005, 09h08

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