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 :

Utilisation de la référence this


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Par défaut Utilisation de la référence this
    Bonjour !

    Je m'excuse tout d'abord si un sujet de même type a déjà été ouvert, j'ai essayé de faire une recherche mais il n'y avait pas de réponse...

    J'ai du mal à saisir toutes les utilisations de this, et comme je sais que c'est assez important, j'aimerais beaucoup un peu d'aide

    Si je prends par exemple le programme suivant :

    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
    // ReferencingThisExplicitly – ce programme montre
    //           comment utiliser explicitement la référence à this
    using System;
    namespace ReferencingThisExplicitly
    {
        public class Class1
        {
            public static int Main(string[] strings)
            {
                //crée un objet student
                Student student = new Student();
                student.Init("Stephen Davis", 1234);
                //inscrit l'étudiant à un cours
                Console.WriteLine
                       ("Inscription de Stephen Davis à Biologie 101");
                student.Enroll("Biologie 101");
                //affichage des cours auxquels est inscrit l'étudiant
                Console.WriteLine("Nouvelles caractéristiques de l'étudiant :");
                student.DisplayCourse();
                // attend confirmation de l'utilisateur
                Console.WriteLine("Appuyez sur Entrée pour terminer...");
                Console.Read();
                return 0;
            }
        }
        // Student - notre étudiant d'université
        public class Student
        {
            //tout étudiant a un nom et un numéro d'identification (id)
            public string sName;
            public int nID;
            //le cours auquel est inscrit l'étudiant
            CourseInstance courseInstance;
            // Init - initialise l'objet student
            public void Init(string sName, int nID)
            {
                this.sName = sName;
                this.nID = nID;
                courseInstance = null;
            }
            // Enroll - inscrit l'étudiant courant à un cours
            public void Enroll(string sCourseID)
            {
                courseInstance = new CourseInstance();
                courseInstance.Init(this, sCourseID);
            }
            //affiche le nom de l'étudiant
            //et le cours
            public void DisplayCourse()
            {
                Console.WriteLine(sName);
                courseInstance.Display();
            }
        }
        // CourseInstance - associe l'étudiant au cours
        //                  auquel il est inscrit
        public class CourseInstance
        {
            public Student student;
            public string sCourseID;
            // Init -établit le lien entre l'étudiant et le cours
            public void Init(Student student, string sCourseID)
            {
                this.student = student;
                this.sCourseID = sCourseID;
            }
            // Display - affiche l'intitulé du cours
            public void Display()
            {
                Console.WriteLine(sCourseID);
            }
        }
    }
    Je crois avoir compris que this est utilisé pour pointer l'objet courant, mais ici on y fait appel plusieurs fois et je ne m'y retrouve pas...

    Si quelqu'un a le courage de me donner une explication plus détaillée de ce programme, ça m'aiderait énormément !

  2. #2
    Membre éclairé Avatar de DonkeyMaster
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 95
    Par défaut
    Citation Envoyé par Ben-j
    // Init - initialise l'objet student
    public void Init(string sName, int nID)
    {
    this.sName = sName;
    this.nID = nID;
    courseInstance = null;
    }
    // Enroll - inscrit l'étudiant courant à un cours
    public void Enroll(string sCourseID)
    {
    courseInstance = new CourseInstance();
    courseInstance.Init(this, sCourseID);
    }
    this fait explicitement référence à l'objet courant.
    Dans la méthode Init, tu as un paramètre appelé sName. Or, tu as déjà un field avec ce même nom. Alors, comment le compilateur fait la différence? Il choisit la variable à la moindre portée, c'est-à-dire que quand tu écris sName, il prendra le paramètre, et nom la variable de classe.

    Mais alors, si jamais on avait besoin d'utiliser sName de notre objet, et pas le paramètre? Et bien, avec le mot clé this, on peut dire qu'on part de l'objet, donc, this.sName, c'est le sName de l'objet et non le paramètre. Tu me suis toujours?

    On retrouve cela très souvent dans les constructeurs. On donne aux paramètres le même nom que les variables de l'objet, car après tout, ils représentent la même chose et rendent le code plus lisible.



    Dans la méthode Enroll, tu appelles la méthode courseInstance.Init. Cette méthode attend un Student en paramètre. Or, le Student, on est en plein dedans. Alors, tu lui dis, "tiens, t'as qu'à me prendre moi". Donc, this.


    Il y a en C# au moins une autre utilisation pour le mot-clé this : dans les indexeurs. C'est moins commun, mais je te le montre, comme ça tu sauras.

    En utilisant une Collection, tu as sûrement déjà écrit

    object un_objet = une_collection[1];

    pour prendre un item dans une collection.

    Maintenant, tu es en train d'écrire une classe qui hérite de, disons, ArrayList. Et tu veux faire référence à un élément contenu dans ta ArrayList. Comment faire?

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class DonkeyArrayList : ArrayList {
        ///<summary>retourne un élément, ou si cet élément n'existe pas, en crée un nouveau et le retourne</summary>
        public object GetItem (int index) {
            objet obj=this[index];
            if (obj == null) {
                obj = new Object();
            }
            return obj;
        }
    }

    C'est de la même façon que tu crées tes propres indexeurs dans une classe.

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class DonkeyIndexer {
        private IDictionnary m_dic = new HashTable();
        public string this[string cle] {
            get { return m_dic[cle]; }
            set { m_dic = value; }
        }
    }


    Je crois avoir fait le tour.

    Dans le même genre, tu as le mot-clé base, mais ce sera pour une autre fois

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 11
    Par défaut
    Super, merci beaucoup pour toutes ces explications DonkeyMaster, j'y vois un peu plus clair maintenant

    Bon pour la deuxième partie, je n'ai encore vu ni les collections, ni l'héritage, mais ça me donne un aperçu !

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

Discussions similaires

  1. Erreur de numérotation des images lors de l'utilisation d'une référence
    Par mobi38 dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 9
    Dernier message: 03/09/2007, 16h36
  2. Réponses: 15
    Dernier message: 09/11/2006, 13h06
  3. Utilisations croisés de références vers des dll
    Par Pilloutou dans le forum Framework .NET
    Réponses: 3
    Dernier message: 05/11/2006, 21h56
  4. [C++]Utilisation d'une référence
    Par cfrelet dans le forum C++
    Réponses: 15
    Dernier message: 21/06/2006, 09h35
  5. [C++] Utilisation d'une référence
    Par cfrelet dans le forum C++
    Réponses: 2
    Dernier message: 09/06/2006, 11h10

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