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 :

Objet d'un Dictionary modifié même après l'ajout ?


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 46
    Par défaut Objet d'un Dictionary modifié même après l'ajout ?
    Bonjour,

    est-ce normal qu'un objet qui a été ajouté au dictionnaire, voit sa modification également être prise en compte dans le dictionnaire ?

    Mon objet Skill qui a Num = 2 est modifié après son ajout dans le dictionnaire (Num =3), mais cette modification est automatiquement prise en compte dans le dictionnaire.

    Voici un petit exemple

    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
    51
    52
    53
    54
    55
    56
    57
    namespace TestDic
    {
    	using System;
    	using System.Collections.Generic;
     
    	internal class Program
    	{
    		private static void Main()
    		{
    			Skill skill1 = new Skill {Name = "Skill Test", Num = 1};
    			Skill skill2 = new Skill {Name = "Skill Test", Num = 2};
     
    			Dictionary<string, Skill> dic = new Dictionary<string, Skill>(2);
    			dic.Add(skill1.ToString(), skill1);
     
    			Console.WriteLine("Lecture 1");
    			foreach(KeyValuePair<string, Skill> pair in dic)
    			{
    				Console.WriteLine("Key:{0} Skill:{1}", pair.Key, pair.Value);
    			}
     
    			Console.WriteLine("\nAjout du skill 2");
    			dic.Add(skill2.ToString(), skill2);
     
    			Console.WriteLine("\nLecture 2");
    			foreach(KeyValuePair<string, Skill> pair in dic)
    			{
    				Console.WriteLine("Key:{0} Skill:{1}", pair.Key, pair.Value);
    			}
     
     
    			skill2.Num = 3;
    			Console.WriteLine("\nNum du skill 2 vaut maintenant: {0}", skill2.Num);
    			Console.WriteLine("\nLecture 3");
    			foreach(KeyValuePair<string, Skill> pair in dic)
    			{
    				Console.WriteLine("Key:{0} Skill:{1}", pair.Key, pair.Value);
    			}
    			Console.Read();
    		}
     
    		#region Nested type: Skill
     
    		private class Skill
    		{
    			public String Name { get; set; }
    			public int Num { get; set; }
     
    			public override string ToString()
    			{
    				return string.Format("[{0}]+[{1}]", Name, Num);
    			}
    		}
     
    		#endregion
    	}
    }

    Je voudrai pouvoir modifier mon objet sans que celui-ci soit également modifié dans le dictionnaire...

  2. #2
    Membre chevronné
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 288
    Par défaut
    Normal, dans un dictionnaire, seule les références des objets sont stockées ! donc si tu modifie l'objet même en dehors du dico, tu le vois aussi modifié dans le dico.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 46
    Par défaut
    Ah oki merci J'ai testé avec List<Skill> c'est la même chose (pareil pour toutes les collections génériques?)

    Edit: je dois mal m'y prendre ça fait la même avec une ArrayList ou Skill[].

    Comment stocker un objet dans une liste sans que celui-ci soit modifié après son ajout?

  4. #4
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par Nidel Voir le message
    Ah oki merci J'ai testé avec List<Skill> c'est la même chose (pareil pour toutes les collections génériques?)
    A partir du moment où tu utilises des types références peu importe ton conteneur une modification sur l'objet le modifiera partout.

    Sinon il faut cloner ton objet.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 88
    Par défaut
    Bonjour Nidel,

    Il faut bien que tu comprennes que des que tu manipules des objets en c# (dont le type est une class, et non une struct ou un int / double / ...), tu ne manipules que des références dessus (~ pointeurs).

    Du coup, quand tu mets des objets dans une collection, tu ne mets dedans que les pointeurs...

    si tu veux avoir une "vraie" copie, il faut que tu mettes dans ta collection une "copie" de l'objet En gros, tu en instancies un nouveau, tu le remplies exactement comme celui que tu veux insérer, et tu insères le nouveau dans la collection. Du coup, tu continues à manipuler "l'ancien" objet, et le nouveau créé reste tel quel, sans changer.

    Ceci étant, c'est assez cracra comme méthode. Une autre solution consiste à utiliser des structs, et non des classes. En effet, dans le cas des structs, tu ne manipules pas des pointeurs dessus, mais bien les objets eux-mêmes : quand tu les mets dans des collections, il les copie dedans. Par contre, si tu utilises ce système, pense à bien faire attention de ne pas les copier cinquante fois. N'oublie pas, par exemple, que si tu passes une struct comme paramètre d'une méthode, elle est intégralement copiée (sauf si tu la passes en ref) !!!

    Voila, j'espère que ça pourra t'aider.

    bonne journée

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 46
    Par défaut
    je comprend mieux maintenant, merci beaucoup pour vos explications, je vais faire quelques recherches

Discussions similaires

  1. Réponses: 7
    Dernier message: 13/05/2015, 12h46
  2. [97] Modifier enregistrement après un click sur zone liste
    Par totojordi dans le forum VBA Access
    Réponses: 8
    Dernier message: 27/05/2008, 09h14
  3. Réponses: 2
    Dernier message: 08/05/2008, 07h24
  4. Sérialiser un objet héritant de Dictionary
    Par NicolasJolet dans le forum Contribuez
    Réponses: 0
    Dernier message: 08/05/2008, 00h38
  5. Réponses: 15
    Dernier message: 25/08/2006, 11h05

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