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

C# Discussion :

Problème delegate et ref


Sujet :

C#

  1. #1
    Membre expert
    Profil pro
    Dév
    Inscrit en
    Juin 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 165
    Points : 3 707
    Points
    3 707
    Par défaut Problème delegate et ref
    Bonjour,

    J'ai créer 2 méthodes qui modifient 2 valeurs grâce à ref

    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
    partial class TitleAndDescription
        {
            private string titleFR;
            private string titleEN;
            private string descriptionFR;
            private string descriptionEN;
     
            public TitleAndDescription(string _titleFR, string _titleEN, string _descriptionFR, string _descriptionEN)
            {
                titleFR = _titleFR;
                titleEN = _titleEN;
                descriptionEN = _descriptionEN;
                descriptionFR = _descriptionFR;
            }
            public void GetTitleAndDescriptionEN(ref string _title, ref string _description)
            {
                _title = titleEN;
                _description = descriptionEN;
            }
     
            public void GetTitleAndDescriptionFR(ref string _title, ref string _description)
            {
                _title = titleFR;
                _description = descriptionFR;
            }
     
        }
    Pour choisir laquelle des 2 méthodes à utiliser, j'ai créé un délégué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delegate void DelChoose(ref string title, ref string description);
    Cependant, je no comprends pas pourquoi mon appel n'est pas correct
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DelChoose delChoose;
                    if (isFrench)
                    {
                        delChoose = new DelChoose(TitleAndDescription.GetTitleAndDescriptionFR);
                    }
                    else delChoose = new DelChoose(TitleAndDescription.GetTitleAndDescriptionEN);
    delChoose(ref (string)rawData[indLine, 9], ref (string)rawData[indLine, 6]);
    Merci de votre aide.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Points : 140
    Points
    140
    Par défaut
    Bonjour,

    je vais peut-être dire une bêtise, mais il ne doit pas aprécier le cast avec le mot clef ref

  3. #3
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 177
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 177
    Points : 25 125
    Points
    25 125
    Par défaut
    pas lu la question, mais la réponse doit etre bonne
    avec ref, il est impossible de faire un cast

  4. #4
    Membre éclairé Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 612
    Points : 685
    Points
    685
    Par défaut
    Citation Envoyé par DuyBinh Voir le message
    Cependant, je no comprends pas pourquoi mon appel n'est pas correct
    C'est quoi qui n'est pas correct ?

  5. #5
    Membre expert
    Profil pro
    Dév
    Inscrit en
    Juin 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 165
    Points : 3 707
    Points
    3 707
    Par défaut
    Voilà en virant le ref et donc cette fois je ne récupère qu'une valeur à la fois, j'ai donc créé 2 delegates.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        delegate string DelTitle();
        delegate string DelDescription();
    Donc cette fois dans la classe que j'ai créé je me retrouve avec 4 get
    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
    partial class TitleAndDescription
        {
            private string titleFR;
            private string titleEN;
            private string descriptionFR;
            private string descriptionEN;
     
            public TitleAndDescription(string _titleFR, string _titleEN, string _descriptionFR, string _descriptionEN)
            {
                titleFR = _titleFR;
                titleEN = _titleEN;
                descriptionEN = _descriptionEN;
                descriptionFR = _descriptionFR;
            }
            public string GetTitleEN()
            {
                return titleEN;
            }
     
            public string GetTitleFR()
            {
                return titleFR;
            }
            public string GetDescriptionFR()
            {
                return descriptionFR;
            }
            public string GetDescriptionEN()
            {
                return descriptionEN;
            }
        }
    La méthode qui doit utiliser ce type contient une boucle. A chaque tour de boucle, je génère une clé pour appeler une HashTable qui soit contient un string, soit TitleAndDescription. Or je souhaite éviter de faire un if pour déterminer la langue à chaque tour et donc c'est pour ça que j'ai déclarer des délégués.

    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
    50
     
    object[,] rawData = new object[64000, nCell];
    rawData[0, 0] = "Bus Name";
                    rawData[0, 1] = "Segment";
                    rawData[0, 2] = "Item";
                    rawData[0, 3] = "Position";
                    rawData[0, 4] = "nCharacters";
                    rawData[0, 5] = "Differences";
                    rawData[0, 6] = "Description";
                    rawData[0, 7] = "Former value";
                    rawData[0, 8] = "New value";
     
    if (Path.GetExtension(this.lblStateBusDocumentation.Text) != ".xls")
                    {
                        rawData[0, 9] = "Title";
                    }
     
    /*Création des délégués*/
     
    DelTitle delTitle;
                    DelDescription delDescription;
                    if (isFrench)
                    {
                        delTitle = new DelTitle(TitleAndDescription.GetTitleFR);
                        delDescription = new DelDescription(TitleAndDescription.GetDescriptionFR);
                    }
                    else
                    {
                        delTitle = new DelTitle(TitleAndDescription.GetTitleEN);
                        delDescription = new DelDescription(TitleAndDescription.GetDescriptionEN);
                    }
     
    /*traitement*/
    using (fileIn = new StreamReader(lblStateComparisonFile.Text))
                    {
                        string line = fileIn.ReadLine();
     
                        while ((line = fileIn.ReadLine()) != null)
    		    {
    			//Traitement ...
     
     
    //Remplissage du tableau avec soit avec un string soit grâce à Title et Description selon la bonne langue
    if (Path.GetExtension(lblStateBusDocumentation.Text) != ".xls")
                                    {
                                        TitleAndDescription titleAndDesc = (TitleAndDescription)htBusDescription[short_key + "-" + tabSubitems[j]];
                                        rawData[indLine, 6] = delDescription();
                                        rawData[indLine, 9] = delTitle();
                                    }
                                    else rawData[indLine, 6] = ((string)htBusDescription[short_key + "-" + tabSubitems[j]]);
    Actuellement j'ai une comme erreur :
    Error 1 An object reference is required for the nonstatic field, method, or property 'RxCPTestIHM.TitleAndDescription.GetTitleFR()' D:\Projet\TestingTools\Prototypes\TestingTools 1.0.2 (Proto new index file)\Comparator\Tester.BUS.cs 540 32 Comparator
    Merci de votre aide.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Points : 140
    Points
    140
    Par défaut
    Pour l'erreur, comme tes méthodes ne sont pas statiques, il te faut une instance de ta classe TitleAndDescription :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delTitle = new DelTitle(new TitleAndDescription(/* tes paramètres */).GetTitleFR);
    Sinon, pourquoi n'avoir pas gardé ton delegate avec tes références, mais avec des type Object au lieu de string (pour tester sans tes cast) ?

  7. #7
    Membre expert
    Profil pro
    Dév
    Inscrit en
    Juin 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 165
    Points : 3 707
    Points
    3 707
    Par défaut
    Merci du conseil je vais voir ça. Cependant, pourquoi dans l'exemple que j'ai trouvé sur ce lien et qui marche, l'auteur n'a pas eu besoin d'instancier sa classe au début?

    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
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    # using System;
    #
    # /*
    # ** Ces délégué sont déclarés en dehors de toutes classes,
    # ** ils peuvent pourtant être déclarés dans une classe.
    # */
    #
    # delegate void Délégué();
    # //Ce délégué ne peut pointer que sur des fonctions sans arguments
    # //et retournants void.
    #
    # delegate int Délégué2(int a,bool b);
    # //Paramètres (int et bool), retourne int.
    #
    #
    # class ClassePrincipale
    # {
    # public static void Main()
    # {
    # Délégué test=new Délégué(Classe1.Fonction1);
    # //création d'un délégué de type Délégué
    # //on le fait pointer sur "void Fonction1()" de Classe1.
    #
    # Délégué2 test2=new Délégué2(Classe2.Fonction4);
    # //création d'un délégué de type Délégué2.
    # //on le fait pointer sur "int Fonction4(int,bool)" de Classe2.
    #
    # Classe2 c2=new Classe2();
    #
    # /*
    # ** L'opérateur += est utilisé pour ajouter une fonction
    # ** au poiteur (délégué).
    # ** Si on utilise l'opérateur =, la fonction d'avant est
    # ** perdue.
    # */
    # test+=new Délégué(c2.Fonction3); //ajout d'une fonction.
    # test+=new Délégué(Classe1.Fonction2); //ajout d'une fonction.
    #
    # test(); //appel de la ou les fonction(s) référencées.
    #
    # Console.Out.WriteLine();
    #
    # test-=new Délégué(c2.Fonction3);
    # //Le délégué ne pointe plus sur
    # //la fonction Classe2.Fonction3().
    #
    # test();
    #
    # Console.Out.WriteLine();
    #
    # test=null; //Le délégué ne pointe plus sur aucune fonction.
    # test=new Délégué(c2.Fonction3);
    # test();
    #
    # Console.Out.WriteLine();
    # int a=test2(456,true);
    # Console.Out.WriteLine(a);
    # }
    # }
    #
    #
    # class Classe1 : Object
    # {
    # private Classe1() //Classe non instanciable.
    # {
    # }
    #
    # public static void Fonction1()
    # {
    # Console.Out.WriteLine("Fonction 1");
    # }
    #
    # public static void Fonction2()
    # {
    # Console.Out.WriteLine("Fonction 2");
    # }
    # }
    #
    #
    # class Classe2
    # {
    # public void Fonction3()
    # {
    # Console.Out.WriteLine("Fonction 3");
    # }
    #
    # public static int Fonction4(int a,bool b)
    # {
    # Console.Out.WriteLine("int : " + a);
    # Console.Out.WriteLine("bool : " + b);
    # return a;
    # }
    # }

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Points : 140
    Points
    140
    Par défaut
    Parceque les méthodes qu'il utilise sont déclarées en statique et n'ont donc pas besoin d'avoir une instance de la classe pour être appelées.

  9. #9
    Membre expert
    Profil pro
    Dév
    Inscrit en
    Juin 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 165
    Points : 3 707
    Points
    3 707
    Par défaut
    Voilà je n'ai plus d'erreur mais cependant, mon délégué ne pointe que sur le premier titleAndDesc.

    Instanciation d'un TitleAndDescription et des délégués
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DelTitle delTitle;
                    DelDescription delDescription;
                    TitleAndDescription titleAndDesc = new TitleAndDescription("titreFR test",
                        "TitreEN test", "DescriptionFR test", "DescriptionEN test");
                    if (isFrench)
                    {
                        delTitle = new DelTitle(titleAndDesc.GetTitleFR);
                        delDescription = new DelDescription(titleAndDesc.GetDescriptionFR);
                    }
                    else
                    {
                        delTitle = new DelTitle(titleAndDesc.GetTitleEN);
                        delDescription = new DelDescription(titleAndDesc.GetDescriptionEN);
                    }
    Dans ma boucle while titleAndDesc pointe sur une autre zone mémoire mais les délégués ne font pas de même .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (Path.GetExtension(lblStateBusDocumentation.Text) != ".xls")
                                    {
                                        titleAndDesc = (TitleAndDescription)htBusDescription[short_key + "-" + tabSubitems[j]];
     
                                        rawData[indLine, 6] = delDescription();
                                        rawData[indLine, 9] = delTitle();
                                    }
                                    else rawData[indLine, 6] = ((string)htBusDescription[short_key + "-" + tabSubitems[j]]);
    Les valeurs que renvoie delDescription() et delTitle() sont toujours :
    • titreFR test
    • descriptionFR test
    • l'inverse si c'est de l'anglais qu'on choisit


    Je voulais donc savoir si il était possible de mettre à jour les délégués sans passer par un if.

    Merci de votre aide.

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Février 2008
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 114
    Points : 140
    Points
    140
    Par défaut
    Voila une soluton qui devrais fonctionner, bien que faite un peu à la va vite.

    delgate :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    delegate string GetTranslationHandle(TitleAndDescription o);
    classe TitleAndDescription
    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
     
        partial class TitleAndDescription
        {
            private string titleFR;
            private string titleEN;
            private string descriptionFR;
            private string descriptionEN;
     
            public TitleAndDescription(string _titleFR, string _titleEN, string _descriptionFR, string _descriptionEN)
            {
                titleFR = _titleFR;
                titleEN = _titleEN;
                descriptionEN = _descriptionEN;
                descriptionFR = _descriptionFR;
            }
            public static string GetTitleEN(TitleAndDescription o)
            {
                return o.titleEN;
            }
     
            public static string GetTitleFR(TitleAndDescription o)
            {
                return o.titleFR;
            }
            public static string GetDescriptionFR(TitleAndDescription o)
            {
                return o.descriptionFR;
            }
            public static string GetDescriptionEN(TitleAndDescription o)
            {
                return o.descriptionEN;
            }
        }
    Utilisation :
    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
     
    /*Création des délégués*/
     
    GetTranslationHandle delTitle;
                    GetTranslationHandle delDescription;
                    if (isFrench)
                    {
                        delTitle = new GetTranslationHandle(TitleAndDescription.GetTitleFR);
                        delDescription = new GetTranslationHandle(TitleAndDescription.GetDescriptionFR);
                    }
                    else
                    {
                        delTitle = new GetTranslationHandle(TitleAndDescription.GetTitleEN);
                        delDescription = new GetTranslationHandle(TitleAndDescription.GetDescriptionEN);
                    }
     
    /*traitement*/
    using (fileIn = new StreamReader(lblStateComparisonFile.Text))
                    {
                        string line = fileIn.ReadLine();
     
                        while ((line = fileIn.ReadLine()) != null)
    		    {
    			//Traitement ...
     
     
    //Remplissage du tableau avec soit avec un string soit grâce à Title et Description selon la bonne langue
    if (Path.GetExtension(lblStateBusDocumentation.Text) != ".xls")
                                    {
                                        TitleAndDescription titleAndDesc = (TitleAndDescription)htBusDescription[short_key + "-" + tabSubitems[j]];
                                        rawData[indLine, 6] = delDescription(titleAndDesc );
                                        rawData[indLine, 9] = delTitle(titleAndDesc );
                                    }
                                    else rawData[indLine, 6] = ((string)htBusDescription[short_key + "-" + tabSubitems[j]]);
    Il doit surement y avoir plus joli et plus propre, mais ça devrais fonctionner.

  11. #11
    Membre expert
    Profil pro
    Dév
    Inscrit en
    Juin 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Dév

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 165
    Points : 3 707
    Points
    3 707
    Par défaut
    Merci ton code marche . Il me reste plus à analyser comment marche cette délégation.

    Encore merci .

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème \label et \ref
    Par olivier1978 dans le forum Mise en forme
    Réponses: 2
    Dernier message: 04/10/2007, 22h30
  2. [C#][Thread][Invoke] petit problème de delegate
    Par clinic dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 22/06/2007, 11h38
  3. [C++/CLI] problème avec Timer ou delegate
    Par breezer911 dans le forum Visual C++
    Réponses: 1
    Dernier message: 11/04/2007, 15h27
  4. Problème avec \label et \ref
    Par Anamelech dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 2
    Dernier message: 14/12/2006, 09h57
  5. Réponses: 1
    Dernier message: 24/11/2006, 16h36

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