none
Gestion de la mémoire pour les List et Array RRS feed

  • Discussion générale

  • Bonjour,

    Je me suis rendu compte après quelques tests que la gestion des objets "standard" et la gestion des objets List était différente. Je ne comprends pas quelle en est la raison au niveau de la gestion des objets en mémoire. Pourquoi list2 = list1 n'est pas une copie par référence? Et donc pourquoi ne doit-on pas utiliser un constructeur par (re)copie pour les listes contrairement aux objets "standard"?

    Exemple Objet "standard" :

     public
     class
     Stylo
     {
      public
     string
     Couleur = string
    .Empty;
    
      public
     Stylo() { }
    
      public
     Stylo(string
     couleur)
      {
       Couleur = couleur;
      }
    
      public
     Stylo(ref
     Stylo obj)
      {
       this
    .Couleur = obj.Couleur;
      }
    }
    
    Stylo A = new
     Stylo("rouge"
    );
    Stylo B = A;
    //A et B ont comme couleur rouge
    
    
    A.Couleur = "vert"
    ;
    //A et B ont comme couleur vert
    
    
    B = new
     Stylo(ref
     A);
    A.Couleur = "orange"
    ;
    //A a comme couleur orange et B a comme couleur vert
    
    
    
    
    
    
    

    Exemple Objet liste :

    List<Stylo> lst1 = new List<Stylo>();
    List<Stylo> lst2 ;
    
    lst1.Add(new Stylo("bleu"));
    lst2 = lst1;
    
    //lst1 et lst2 sont identique et contiennent un Stylo bleu
    
    lst1.Add(new Stylo("noir"));
    //lst1 contient un Stylo bleu et un noir
    //lst2 contient un Stylo bleu uniquement !?!
    

    Merci d'avance.

     

    vendredi 12 novembre 2010 10:36

Toutes les réponses

  • Bonjour,

    Il doit y avoir un problème dans la façon dont est examiné le contenu de lst2.

    Comme dans le cas précédent lst1 et lst2 référencent le même objet (après essai j'ai bien ici le résultat attendu donc lst1 et lst2 qui ont un seul et même contenu qui est donc "bleu" et "noir").

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    vendredi 12 novembre 2010 11:15
    Modérateur
  • Bonjour,

    Pouvez utiliser le code suivant et nous dire le résultat affiché ?

    Console.WriteLine(lst1[0].Couleur);
    Console.WriteLine(lst1[1].Couleur);
    Console.WriteLine(lst2[0].Couleur);
    Console.WriteLine(lst2[1].Couleur);
    

    Cordialement


    Gilles TOURREAU - MVP C# - MCPD Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5 - MCTS ADO .NET 3.5 / SQL Server 2008 Developper - Architecte .NET/Consultant/Formateur - http://gilles.tourreau.fr
    vendredi 12 novembre 2010 12:53
    Modérateur
  • Bonjour,

     

    Dogged64, est-ce que vous pouvez nous communiquer le résultat de l’exécution du code de M. Tourreau ?

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    mercredi 17 novembre 2010 10:13