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 :

ref ou pas ref devant des objets ? [Débutant]


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut ref ou pas ref devant des objets ?
    Hello,

    Je passe en paramètre à une fonction à un objet. À l'intérieur, je mets à jour ledit objet. Et quand je sors de la fonction, c'est comme si je n'avais rien fait. Ou plutôt : comme si l'objet avait été passé par copie.

    Or, je croyais qu'en C#, par défaut, les instances de classes étaient passées par référence ? Et que donc adjoindre le mot-clé ref à un paramètre d'une classe faite maison était inutile ?

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2009
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 317
    Par défaut
    Par défaut, lorsque tu passe un paramètre, il est passé par valeur et non pas référence.

    Pour le passer par référence, tu peux comme tu l'as dit auparavant utiliser ref ou encore out.

    Voir ici ou encore ici pour d'avantages d'informations.

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Tout est passé par copie en C#! Reste plus qu'à savoir si c'est l'instance qui est copiée ou la référence vers l'instance!
    Voici un exemple fait avec LinqPad:
    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
    void Main()
    {
    	var myClass = new MyClass{A=1};
    	myClass.Dump();
    	TestPasRef(myClass);
    	myClass.Dump();
    	TestRef(ref myClass);
    	myClass.Dump();
     
    	var myStruct = new MyStruct{A=1};
    	myStruct.Dump();
    	TestPasRef(myStruct);
    	myStruct.Dump();
    	TestRef(ref myStruct);
    	myStruct.Dump();
    }
     
    void TestPasRef(MyClass obj)
    {
    	obj.A = 2;
    	obj = new MyClass{A=3}; 
    }
     
    void TestRef(ref MyClass obj)
    {
    	obj.A = 2;
    	obj = new MyClass{A=3};
    }
     
    void TestPasRef(MyStruct obj)
    {
    	obj.A = 2;
    	obj = new MyStruct{A=3}; 
    }
     
    void TestRef(ref MyStruct obj)
    {
    	obj.A = 2;
    	obj = new MyStruct{A=3};
    }
     
    class MyClass
    {
    	public int A {get;set;}
    }
     
    struct MyStruct
    {
    	public int A {get;set;}
    }
    Et son résultat:
    MyClass:
    A 1

    A 2

    A 3

    MyStruct:
    A 1

    A 1

    A 3
    On s'apercoit qu'une class c'est une copie du pointeur, pour une struct une copie de l'instance

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par Aeronia Voir le message
    Par défaut, lorsque tu passe un paramètre, il est passé par valeur et non pas référence.
    J'avais compris l'inverse quand c'était un type référence (ce qui est le cas des classes), et que c'était justement al principale différence avec les structures qui sont passées par valeur.

    Cela dit, j'ai compris d'où venait mon erreur : dans le corps de la fonction, je réaffectais au paramètre un new. :-)

    Probablement une évolution de code (out vers ref...) mal faite.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    Avec les types primitifs (int, long, bool) tu obtiens une copie de leurs valeur.
    Avec les types references tu obtiens une copie du pointeur qui te permet donc de changer les valeurs de l'objet mais pas son adresse.

    Quand tu fait un myobject =new Object() tu crées un nouvelle objet en mémoire que tu assignes au pointeur myobject


    Pour pouvoir changer la référence d'un objet tu dois utiliser ref.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    OK.

    Donc la différence n'existe que lorsqu'on affecte un nouvel objet au paramètre qui nous a été passé ?

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Février 2003
    Messages
    2 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 2 194
    Par défaut
    En fait il n'y a pas de différence.

    Tous passe par copie

    tu reçois une copie du type primitif et une copie du pointeur mais le second (pointeur) te permet de changer les propriétés d'un objet mais pas sa référence (or maclass= b et maclass=new maclass() donne de nouvelles adresses(référence))

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

Discussions similaires

  1. By val et By ref appliquées à des objets de types structurés
    Par new_wave dans le forum Framework .NET
    Réponses: 3
    Dernier message: 02/06/2009, 10h40
  2. Réponses: 3
    Dernier message: 05/05/2008, 14h55
  3. Réponses: 2
    Dernier message: 20/06/2007, 15h31
  4. Ma class n'apparait pas dans la liste des objets de mon programme.
    Par parp1 dans le forum VB 6 et antérieur
    Réponses: 9
    Dernier message: 25/04/2007, 15h20
  5. J'ai pas les infos des objets dans l'éditeur
    Par mister3957 dans le forum MFC
    Réponses: 3
    Dernier message: 20/02/2006, 19h43

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