Partage
  • Partager sur Facebook
  • Partager sur Twitter

C# - Passage d'objet par référence

ref

Sujet résolu
    8 mai 2011 à 13:55:52

    Développement C# (.NET) > Notions fondamentales > La programmation orientée objet (3/3)

    Bonjour,

    Dans le tuto cité précédemment, les auteurs indiquent dans un premier temps que les objets sont passés par défaut "par référence".

    Cependant dans le programme suivant:
    using System;
    
    namespace ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Vis ma vis  \n\n\n");
                People amandine = new People("Amandine", "Bourlier", 20);
                People françois = new People("François", "Bourlier", 26);
    
                Console.WriteLine("Les personnages présents sont " + amandine._name + " et " + françois._name +"\n");
                Console.WriteLine("On applique la fonction switchPeople !\n");
    
                switchPeople(ref amandine, ref françois);
    
                Console.WriteLine("Hé hé ! Maintenant les personnages présents sont " + amandine._name + " et " + françois._name + "\n");
                Console.ReadKey();
            }
    
            #region methods
            static void switchPeople(ref People firstPeople, ref  People secondPeople)
            {
                People ribbonPeople = firstPeople;
                firstPeople = secondPeople;
                secondPeople = ribbonPeople;
            }
            #endregion
        }
    
        class People
        {
            #region fields
            public string _name { get; set; }
            public string _sirName { get; set; }
            public int _age { get; set; }
            #endregion
    
    
            #region constructor
            public People(string name, string sirName, int age)
            {
                this._name = name;
                this._sirName = sirName;
                this._age = age;
            }
            #endregion
        }
    }
    


    Les personnages ne sont intervertis que dans le cas où j'ajoute le mot "ref" dans la fonction swithPeople.
    Comment se fait-t-il que "ref" soit nécessaire, alors que les objets sont passés par défaut par référence ?

    J'aimerais être sûr d'avoir bien compris le passage par référencement.
    Je vous remercie d'avance :)

    Une très bonne journée à tous !

    Alexandre
    • Partager sur Facebook
    • Partager sur Twitter
      8 mai 2011 à 14:17:33

      Oui, le passage par référence d'objet qui se passe déjà par référence est complexe ^^

      Il faut utiliser le mot clé ref pour intervertir les deux personnages car par défaut on fait une copie de la référence.

      Je vais essayer de te donner un exemple supplémentaire.

      Imagines un fichier sur ton ordinateur, c'est ton objet de type Personne, tu en fais un raccourci, et tu copies ce raccourci pour le placer ailleurs. A present, tu veux modifier le premier raccourci pour qu'il pointe sur un autre fichier, si tu modifies le raccourci "collé", ça ne modifiera pas le fichier sur lequel pointe le raccourci "copié". Là c'est le passage par référence sans ref.

      A présente, imagine toujours un fichier, tu en fais un raccourci, et puis tu crée un raccourci de ce raccourci (je sais meme pas si c'est possible mais c'est pour l'exemple ^^ ). Si tu accède au raccourci de raccourci, tu vas pouvoir modifier le fichier sur lequel pointe le raccourci "simple" car tu as une référence de référence, ce qui te permet de modifier la premier référence.

      En résumé, avec le passage en parametre d'une méthode d'un objet de type de référence, tu vas pouvoir modifier les propriétés de cet objet, mais tu ne pourras l'objet entier sur lequel pointe la référence.

      (Oui, je m'embrouille un peu, c'est pas facile à expliquer ^^ )
      • Partager sur Facebook
      • Partager sur Twitter
        8 mai 2011 à 14:52:21

        Je trouve que le tuto de Narvarth explique assez bien le passage d'objets en paramètres, mais ce n'est que mon avis :)
        • Partager sur Facebook
        • Partager sur Twitter
          8 mai 2011 à 20:55:11

          Les objets sont passés par référence. Quand tu ajoutes le mot clé ref, alors c'est la référence elle même qui est passée par référence.
          • Partager sur Facebook
          • Partager sur Twitter
            12 mai 2011 à 12:07:59

            Ok ! Merci sincèrement pour vos réponses.
            Je pense avoir capté. La clé du problème c'est que les méthodes, par défaut, font des copies de ce qu'on leur donne en paramètre, c'est ça ?
            Du coup même si c'est un Objet passé en paramètre, la méthode en fera une copie et bossera sur la copie de la référence.

            C'est la raison pour laquelle on peut modifier les champs des objets sans "ref", mais pas la référence à l'objet lui-même, étant donné que c'est une copie de référence avec laquelle on bosse.

            Dans mon exemple, sans le mot clé "ref", on intervertie des copies de références, qui sont supprimées de la mémoire vive au "return" de la méthode.
            Par conséquent on se retrouve avec les références initialement passées en paramètre.
            J'ai été le plus clair possible mais je pense que la notion est rentrée.

            Merci encore !
            • Partager sur Facebook
            • Partager sur Twitter
              12 mai 2011 à 13:07:00

              Citation : euloiix

              Ok ! Merci sincèrement pour vos réponses.
              Je pense avoir capté. La clé du problème c'est que les méthodes, par défaut, font des copies de ce qu'on leur donne en paramètre, c'est ça ?
              Du coup même si c'est un Objet passé en paramètre, la méthode en fera une copie et bossera sur la copie de la référence.

              C'est la raison pour laquelle on peut modifier les champs des objets sans "ref", mais pas la référence à l'objet lui-même, étant donné que c'est une copie de référence avec laquelle on bosse.

              Dans mon exemple, sans le mot clé "ref", on intervertie des copies de références, qui sont supprimées de la mémoire vive au "return" de la méthode.
              Par conséquent on se retrouve avec les références initialement passées en paramètre.
              J'ai été le plus clair possible mais je pense que la notion est rentrée.

              Merci encore !



              C'est exactement ça
              • Partager sur Facebook
              • Partager sur Twitter
                13 mai 2011 à 1:35:32

                À noter que les types valeurs (les structs, comme int, bool ou DateTime) sont passés par valeur (et donc entièrement copiés). Par conséquent, utiliser ref avec ces types provoquera un passage par référence de l'objet entier (imitant le comportement des types références).
                • Partager sur Facebook
                • Partager sur Twitter

                C# - Passage d'objet par référence

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown