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

Développement Windows Discussion :

Urgent : Deux listes d'objets qui s'auto-modifient


Sujet :

Développement Windows

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2016
    Messages : 35
    Points : 28
    Points
    28
    Par défaut Urgent : Deux listes d'objets qui s'auto-modifient
    Bonjour,

    Je travaille sur Visual Studio 2015 en vb.net.

    J'ai créé une classe (extrait ci-dessous)
    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
     
    Public Class Po_
        'PO
        Public _Num As Integer 'Numéro de PO
        Public _ComposantsScanned As List(Of Composant_)
        Public _ComposantsScannedCumul As List(Of Composant_)
     
        Public Property ComposantsScanned() As List(Of Composant_)
            Get
                Return _ComposantsScanned
            End Get
            Set(ByVal value As List(Of Composant_))
                _ComposantsScanned = value
            End Set
        End Property
     
     
        Public Property ComposantsScannedCumul() As List(Of Composant_)
            Get
                Return _ComposantsScannedCumul
            End Get
            Set(ByVal value As List(Of Composant_))
                _ComposantsScannedCumul = value
            End Set
        End Property
    End Class
    La liste ComposantsScanned est la liste complète et ComposantsScannedCumul est la liste où certains composants identiques sont cumulés (j'additionne la variable CartonsNb du composant déjà existant et je n'ajoute pas le 2ème composant)
    Il y a donc deux objets qui sont des listes d'un autre objet composant extrait ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Public Class Composant_
        Public _Code As String ' Code 
        Public _CartonsNb As Integer 'Quantité de cartons pour un composant
     
        Public Property CartonsNb() As Integer
            'Propriété Nombre de cartons pour un composant
            Get
                Return _CartonsNb
            End Get
            Set(ByVal value As Integer)
                _CartonsNb = value
            End Set
        End Property
    Quand je boucle sur la liste ComposantsScanned pour alimenter l'autre liste ComposantsScannedCumul, ma liste ComposantsScanned est modifiée alors que je ne modifie que la liste ComposantsScannedCumul

    Extrait de la boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    For Each Comp In PO.ComposantsScanned
                'On boucle sur la ligne des composantsScanned
                comp_i = ComposantsListe_Recherche(PO.ComposantsScannedCumul, Comp.Code, Comp.LotKarvinaNum)
                If comp_i <> CodePasTrouve Then
                    'On a trouvé le composant
                    PO.ComposantsScannedCumul(comp_i).ComposantNb = PO.ComposantsScannedCumul(comp_i).ComposantNb + Comp.ComposantNb
                    PO.ComposantsScannedCumul(comp_i).CartonsNb = PO.ComposantsScannedCumul(comp_i).CartonsNb + Comp.CartonsNb
                Else
                    'On n'a pas trouvé le composant
                    PO.ComposantsScannedCumul.Add(Comp)
                End If
    Concrètement quand je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PO.ComposantsScannedCumul(comp_i).CartonsNb = PO.ComposantsScannedCumul(comp_i).CartonsNb + Comp.CartonsNb
    Et bien PO.ComposantsScanned(comp_i).CartonsNb prend la même valeur que PO.ComposantsScannedCumul(comp_i).CartonsNb
    Quelqu'un peut m'aider ???? c'est forcément urgent

    Merci d'avance

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    C'est tout à fait normal. Ta classe composant est une classe. Cela signifie que partout où tu as une instance de ta classe, tu as une référence à cette instance. Il faut donc que tu vois ta première liste comme une liste de référence à tes instances composants. Tu composes ensuite ta seconde liste à partir des références de ta première (si une référence n'est pas trouvée, tu la rajoutes). Mais comme tu rajoutes une référence, l'objet dans tes deux listes est le même !

    Donc si tu modifies l'un, tu modifies l'autre. Et c'est exactement le comportement que tu as.

    Si tu veux éviter cela, tu as plusieurs solution :
    • Ne pas copier la référence, mais instancier une nouvelle instance de ta classe Composant lorsque tu rajoutes un élément à ta seconde liste ;
    • Utiliser des struct à la place des class (désolé, je suis Csharpiste, je ne sais pas si la terminologie est là même en VB !). Les structs sont passées par valeur (ce qu'il te faudrait ici) tandis que les class sont gérées par référence.


    A noter que le second point peut avoir de forte répercution sur le reste de ton code, puisque struct et class ne sont pas interchangeables (différence valeur/référence, pas d'héritage pour les structs, etc...). Donc si tu ne sais pas trop et que tu hésites, prend la solution numéro 1 !
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2016
    Messages : 35
    Points : 28
    Points
    28
    Par défaut
    Merci d'abord pour ta réponse.
    Et d'ailleurs c'est bien ce que j'avais compris de mon problème. Il me reste donc à savoir comment correctement "instancier" la classe Composant dans ma 2ème liste.


    Citation Envoyé par dorinf Voir le message
    Bonjour,

    C'est tout à fait normal. Ta classe composant est une classe. Cela signifie que partout où tu as une instance de ta classe, tu as une référence à cette instance. Il faut donc que tu vois ta première liste comme une liste de référence à tes instances composants. Tu composes ensuite ta seconde liste à partir des références de ta première (si une référence n'est pas trouvée, tu la rajoutes). Mais comme tu rajoutes une référence, l'objet dans tes deux listes est le même !

    Donc si tu modifies l'un, tu modifies l'autre. Et c'est exactement le comportement que tu as.

    Si tu veux éviter cela, tu as plusieurs solution :
    • Ne pas copier la référence, mais instancier une nouvelle instance de ta classe Composant lorsque tu rajoutes un élément à ta seconde liste ;
    • Utiliser des struct à la place des class (désolé, je suis Csharpiste, je ne sais pas si la terminologie est là même en VB !). Les structs sont passées par valeur (ce qu'il te faudrait ici) tandis que les class sont gérées par référence.


    A noter que le second point peut avoir de forte répercution sur le reste de ton code, puisque struct et class ne sont pas interchangeables (différence valeur/référence, pas d'héritage pour les structs, etc...). Donc si tu ne sais pas trop et que tu hésites, prend la solution numéro 1 !

Discussions similaires

  1. [C#] Comparer les valeurs de deux listes d'objets
    Par pitipilot dans le forum C#
    Réponses: 12
    Dernier message: 08/12/2014, 11h59
  2. [Débutant] Deux liste d'objets a mettre en relation
    Par bibyon dans le forum C#
    Réponses: 2
    Dernier message: 20/01/2012, 13h27
  3. 2 listes de choix qui s'auto mettent à jour
    Par quentin57 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 06/08/2009, 00h05
  4. un objet qui s'efface d'une liste STL
    Par BruceBoc dans le forum SL & STL
    Réponses: 17
    Dernier message: 21/02/2007, 21h21
  5. methode qui retourne une liste d'objets du meme type
    Par anoukhan dans le forum Oracle
    Réponses: 8
    Dernier message: 12/01/2006, 18h38

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