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 :

question de base sur la copie d'objet + nom d'un objet


Sujet :

C#

  1. #1
    Membre éclairé Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    710
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 710
    Par défaut question de base sur la copie d'objet + nom d'un objet
    Hello,

    je suis en train de me former au C# (notamment par la lecture de l'excellent bouquin C# et .net) et j'aurai 2 petites questions pour lesquelles je n'ai pas trouvé de réponses suffisamment explicites :

    1. Copie d'objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public maClasse{
    public int v1;
    }
     
    maClasse x, y;
    x = new maClasse();
    x.v1=10;
    y = x;
    y.v1 = 20;
    Si à la suite de ce code, j'affiche x.v1, j'aurai 20 comme résultat.
    Le bouquin stipule que cela est dû au fait que si les références x et y sont 2 espaces mémoires distincts, la partie données est identique et qu'il aurait fallu utiliser new pour créer 2 objets distincts tant au niveau référence que données.

    J'ai donc modifié le code de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    maClasse x, y;
    x = new maClasse();
    y = new maClasse();
    x.v1=10;
    y = x;
    y.v1 = 20;
    Le souci est que même avec un instanciation de y via new, si je modifie le champs v1 de y, celui de x est également modifié...

    Est-ce normal ? Quelle erreur ai-je fait ? et si je n'ai pas fait d'erreur, n'est-il pas possible d'initialiser les données d'un objet à partir d'un autre sans introduire cette relation de données partagées de 2 objets à priori distincts ?

    Seconde interrogation : existe-t-il une méthode permettant de retourner le nom de la variable objet courante. Illustration :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public maClasse{
     
    public void afficheNomObjet(){
    console.writeline("nom objet courant = " + ...);
    }
     
    maClasse x, y;
     
    x.afficheNomObjet();
    y.afficheNomObjet();
    Existe-t-il une méthode à mettre à la place des ... dans affichenomObjet pour laquelle le code ci-dessus permettrait d'afficher :
    nom objet courant = x
    nom objet courant = y

    merci de votre aide !

  2. #2
    Membre éclairé Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    710
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 710
    Par défaut
    bon pour la première question, j'ai trouvé cette réponse très complète...

    http://www.developpez.net/forums/new...te=1&p=6722713

  3. #3
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Par défaut
    Pour ta seconde interrogation tu peut passer dans ta méthode "afficheNomObjet" un paramètre :


    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
     
     class Program
        {
            static void Main(string[] args)
            {
     
             Test x = new Test(10);
             Test y = new Test(20);
             Test.afficheNomObjet(x);
     
            }
        }
     
        class Test
        {
            public int v1 { get; set; }
     
            public Test(int v1)
            {
                this.v1 = v1;
            }
     
            static public void afficheNomObjet(Test newTest)
            {
                Console.WriteLine("nom objet courant " + newTest.v1);
                Console.Read();
            }
        }
    ou

    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
    class Program
        {
            static void Main(string[] args)
            {
                Test x = new Test(10);
                Test y = new Test(20);
                Console.WriteLine(" nom objet courant " + Test.afficheNomObjet(x));
                Console.WriteLine(" nom objet courant " +  Test.afficheNomObjet(y));
               Console.Read();
     
     
            }
        }
     
        class Test
        {
            public int v1 { get; set; }
     
            public Test(int v1)
            {
                this.v1 = v1;
            }
     
            static public int afficheNomObjet(Test newTest)
            {
                return newTest.v1;
            }
        }
    En ce qui concerne la modification d'un objet par rapport a un autre, avec le

    y = x
    la valeur de x sera automatiquement écrasé.

    Si tu créer deux instance et affecté a chaque instance leur propre valeur, je ne comprend pas pourquoi tu fais cette égalité entre les objet ?

  4. #4
    Membre éclairé Avatar de grinder59
    Inscrit en
    Septembre 2005
    Messages
    710
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 710
    Par défaut
    merci de ton retour, mais je ne suis pas d'accord avec l'une ou l'autre de tes solutions (point 2 sur le nom de la variable courante). En effet, les codes que tu donnent vont afficher la valeur du champ v1 de l'objet courant et non le nom de l'objet courant !

    Si un objet x.v1 = 10, je souhaite que la méthode afficheNomObjet(x) écrive "x" et non "10" !

    Concernant la copie d'objet dans un autre, le but est de créer un objet y dont les valeurs des champs sont identiques à celles d'un objet existant x mais en ayant x et y indépendants, ce qui n'est pas le cas avec y = x sans un minimum de précaution, et ce contrairement aux variables de structures...

  5. #5
    Membre très actif Avatar de Pynouz
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 274
    Par défaut
    Tu ne peux effectivement pas copier un objet par un simple x = y.

    Pour cela, il faut implémenter une méthode Copy() par exemple.
    Dans laquel tu donnera les valeur des propriété a ton nouvelle objet.

    Dans une classe "Enfant" par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     public void Copy(Enfant enfant)
            {
                enfant.nom = this.nom;
                enfant.prenom = this.prenom;
            }
    La copie se fera ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     Enfant e1 = new Enfant();
                Enfant e2 = new Enfant();
                e1.Copy(e2);

  6. #6
    Membre actif
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Janvier 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2011
    Messages : 71
    Par défaut
    Bonjour,

    Plutot que de faire une methode Copy, le plus clean est de faire l'implémentation de l'interface IClonable prévue pour ça.
    Autant prendre les bonnes habitudes dès le début.

    Pour la première question :
    Quand tu fais dans ton cas x=y, c'est l'adresse mémoire de y qui est copié dans la variable x. C'est ce que l'on appelle des types références.
    A l'inverse des type valeurs (int, decimal, bool, etc...) quand tu utilise le signe = d'affectation, c'est l'adresse mémoire que tu copie. Donc toute modification sur l'une des deux variable va modifier l'objet qui se trouve à l'adresse mémoire pointé par tes deux variables.

    Pour la deuxième question:
    Je ne pense pas que se soit simple à faire. Le nom de ta variable est en effet utilisée uniquement dans ton code source. Même après génération du code MSIL, les noms de variables ne sont pas obligatoires, regardes le fonctionnement des obfuscateurs.
    A part utiliser une propriété Name dans tes classe que tu initialise dans le constructeur, je ne voie pas de solution.

  7. #7
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2011
    Messages
    255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2011
    Messages : 255
    Par défaut
    + 100000 pour brnf1

    Le mieux est l' interface IClonable.

    Tout est expliquer ici :

    http://floriannouri.developpez.com/t...t/copy-object/

Discussions similaires

  1. Réponses: 13
    Dernier message: 10/10/2007, 10h09
  2. [Débutant] Questions de base sur java
    Par JajaY dans le forum Langage
    Réponses: 2
    Dernier message: 04/04/2006, 18h51
  3. Question de base sur l'utilisation de la fonction date()
    Par deaven dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/12/2005, 15h33
  4. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20
  5. [Débutant] Question de base sur le BDE et les SGBD
    Par Invité dans le forum Bases de données
    Réponses: 3
    Dernier message: 15/03/2005, 08h45

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