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 :

Fonction et référence d'objet.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Par défaut Fonction et référence d'objet.
    Bonjour,

    Je viens de tomber sur une réaction plutôt bizarre de mon code.

    Soit 2 classes :

    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
    class TableauGest
    {
        public int[,] board;
     
        public TableauGest(int dimensionX, int dimensionY)
        {
            board = new int[dimensionX, dimensionY];
            for (int i = 0; i < dimensionX; i++)
            {
                for (int j = 0; j < dimensionY; j++)
                {
                    board[i, j] = 0;
                }
            }
        }
     
        //diverses autres fonction pour gérer le tableau
    }
     
    class TableauCalc
    {
        public void AjouterValeur(TableauGest tableau)
        {
            tableau.board[2, 3] = 4;
        }
    }
    Les chiffres et fonctions sont fictives bien évidement, mais le fonctionnement est le même que dans mon projet.

    Donc avec ces deux classes, si dans mon main je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TableauGest testTableauGest = new TableauGest(5 , 6);
    TableauCalc testTableauCalc = new TableauCalc();
    testTableauCalc.AjouterValeur(testTableauGest);
    Là, à mon grand étonnement, la valeur de testTableauGest.board[2, 3] est changée pour 4 .

    Hors, vu que n'utilise pas le mot clé ref, la valeur du tableau d'origine ne devrait pas être changée, si?

    Donc, mon but, est de faire en sorte que le tableau testTableauGest du main() ne soit pas modifié par la fonction testTableauCalc.AjouterValeur(). Avez vous une idée du problème?

    Moi qui croyais avoir appréhendé la notion de référence en C#, me voilà tout perdu

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2005
    Messages
    131
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 131
    Par défaut
    Salut !!

    Au faite le comportement est carrément correcte, cad que la valeur du tableau de la classe passé en paramètre va être changé par la fonction de la deuxième, la question maintenant est pourquoi, et bein tout simplement parce que les classes sont des types références, les tableaux aussi, donc au moment ou tu passe en paramètre a ta fonction un objet de la première et bein ce qui se passe c'est que l'adresse de ton objet qui est passé par valeur, et donc tu va me dire c'est quoi la différence avec le mot clé ref, et la réponse c'est que si je passe l'objet par le mot clé ref et que dans ma fonction j'écris par exemple :

    tableau = null;

    alors je vais détruire l'objet testTableauGest.

    Sinon j'ai passe l'argument sans le ref , et bein donc même si je fais :

    tableau = null;

    j'aurai toujours mon objet testTableauGest qui sera alloué en mémoire

    Je sais pas est t'a saisi ce que je veux dire ou non ?

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2009
    Messages
    100
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 100
    Par défaut
    Salut,

    En addition des explications de Mehdi_ab, si tu ne veux pas que ton tableau soit modifié, il faut en faire une copie je pense.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 139
    Par défaut
    Comme quoi... On en apprend tous les jours, même sur les bases

    Bon bah je vais me recopier entièrement mon objet

    Merci pour vos réponses

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

Discussions similaires

  1. [DOM XML] Erreur fonction load() d'un objet dom??
    Par ribrok dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 04/10/2005, 11h43
  2. Fonctions imbriquées - références
    Par Yux dans le forum Langage
    Réponses: 12
    Dernier message: 04/10/2005, 11h01
  3. Référence à un objet existant depuis une classe
    Par Adrenalys dans le forum ASP
    Réponses: 2
    Dernier message: 21/07/2005, 00h44
  4. Réponses: 10
    Dernier message: 03/03/2005, 13h36

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