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 :

Passage par référence d'une classe incompréhensible pour moi


Sujet :

C#

  1. #1
    Invité
    Invité(e)
    Par défaut Passage par référence d'une classe incompréhensible pour moi
    Salut,

    Je sais ce que veux dire passage par référence et par valeur. J'ai l'habitude d'utiliser le passage par réference que pour les variables simple tels que les int, double etc... A ma grande surprise sur un projet que je dois maintenir pour apporter des modifications , je me rends que le développeur a défini ne fonction prenant en paramètre une classe et la passe par réference c-à-d
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public void MaFonction(ref MaClasse val) { ....}
    .
    Le compilateur compile à merveille et msdn me fournit des infos la dessus mais pas assez clair.

    Ma question est pourquoi se fatiguer à passer par réference une classe alors celle-ci est par défaut passer par réference à la methode ?

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

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

    l'utilité de ref, c'est de pouvoir modifier l'objet qui est pointé pour permettre à l'appelant d'avoir un autre objet plutot que le même (je ne suis pas sur d'être très clair).
    Un example est plus parlant :

    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
     
    public void ChangeString(string s)
    {
      s = "pas de changement";
    }
     
    public void ChangeStringAvecRef(ref string s)
    {
      s = "un changement";
    }
     
    public static main()
    {
      var test = "hello";
      ChangeString(test);
      // test vaut toujours hello
      ChangeStringAvecRef(ref test);
      // test vaut maintenant "un changement"
    }

  3. #3
    Invité
    Invité(e)
    Par défaut
    Ok, je suis d'accords. Mais pourquoi ça alors qu'on m'a toujours dis que les objet de type réference sont toujours passer par réference non ?

  4. #4
    Invité
    Invité(e)
    Par défaut
    Par exemple si j'ai un table contenant des éléments et que je le passe à une fonction (sans le mot clef ref) et qe je modifie ces éléments. A la sortie de la fonction les éléments n'auront peut être pas leur valeur initilial. ça toujours été le cas.

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Do not confuse the concept of passing by reference with the concept of reference types. The two concepts are not related; a method parameter can be modified by ref regardless of whether it is a value type or a reference type. Therefore, there is no boxing of a value type when it is passed by reference.
    La difference est asser subtile
    Par analogie au C je dirais que c'est comme si tu passait un pointeur ou un pointeur de pointeur

    Dans l'exemple suivant, tu verra qu'au retour de test, K et C sont différent



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        public TestRef()
        {
          C_Activity C = new C_Activity();
          C.Client = "moi";
          C_Activity K = C;
          test(ref C);
        }
     
        private void test(ref C_Activity C)
        {
          C = new C_Activity();
          C.Client = "koi";
        }

Discussions similaires

  1. Passage par référence cause une fatal error
    Par CinePhil dans le forum Langage
    Réponses: 3
    Dernier message: 19/12/2014, 10h28
  2. Réponses: 9
    Dernier message: 31/01/2012, 23h11
  3. Réponses: 1
    Dernier message: 29/08/2011, 17h31
  4. Passage par référence d'une référence
    Par Clercq dans le forum Débuter
    Réponses: 4
    Dernier message: 17/04/2009, 18h11
  5. Réponses: 4
    Dernier message: 26/12/2005, 17h01

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