none
Utilisation d'une collection de classe RRS feed

  • Question

  • Bonjour,

    Une classe et une collection de cette classe sont déclarées dans un module standard.

    Public Class Voiture

         Public Couleur as string

    End Class

    Public Parking as Collection (Of Voiture)

     

    Dans une procédure locale, je veux récupérer la valeur de Couleur qui est passée auparavant à Rouge.

     

    Dim TaTa as  Voiture

    Dim Coul as string

     

    Tata = new Voiture

    For Each TaTa in Parking

    Coul=TaTa.Couleur

    next

    Je ne peux passer la valeur de la couleur dans Coul (Nothing). Par contre, je vois bien la valeur de Tata.Couleur, en débogage qui est à Rouge.

     

    Cordialement,

    lundi 27 décembre 2010 09:36

Réponses

  • Les Propriétés exposent les Champs. Les Champs doivent quasiment toujours être gardés privés et n'être accédés que par le get et le set de la Propriété. Les Propriétés permettent donc de changer les Champs sans pour autant affecter la façon dont on y accède. C'est donc une couche d'abstraction qui permet de se rendre indépendants des Champs de l'objet.

    Public Class [MaClasse]
      ' Ceci est un Champ. Il est privé dans la classe et sert à stocker une donnée.
      Private _monChamp As String
    
      ' Ceci est une Propriété. Quand on y accède, elle utilise le Champ sous-jacent.
      ' En fait c'est un contrat(lecture et/ou écriture) qui dans tous les cas n'est jamais affecté par la valeur du Champ.
      Public Property MonChamp() As String
        Get
          Return _monChamp
        End Get
        Set
          _monChamp = value
        End Set
      End Property
    End Class
    

     

     


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    • Marqué comme réponse Alex Petrescu mardi 4 janvier 2011 10:01
    mercredi 29 décembre 2010 11:23

Toutes les réponses

  • Bonjour,

    Peux-tu nous donner l'erreur que tu obtiens ?

    Voilà à quoi devrait ressembler ton code :

    Public Class Voiture
    	Public Sub New()
    	End Sub
    	Public Property Couleur() As String
    		Get
    			Return m_Couleur
    		End Get
    		Set
    			m_Couleur = Value
    		End Set
    	End Property
    	Private m_Couleur As String
    End Class
    
    Public Class Test
    	Private Shared Sub Main(args As String())
    		Dim coul As String
    		Dim Parking As New List(Of Voiture)()
    		For Each v As Voiture In Parking
    			' Je récupère la couleur si elle est renseignée.
    			If Not [String].IsNullOrEmpty(v.Couleur) Then
    				coul = v.Couleur
    				' Maintenant que dans coul j'ai la couleur courante, j'execute les actions que je souhaite.				
    				' Ici mon code ...
    			End If
    		Next
    	End Sub
    End Class

    Si jamais cela ne fonctionne pas, donne-nous plus de précisions.

    Cordialement,

    Thomas

     

     

     


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    lundi 27 décembre 2010 10:57
  • Bonjour,

    je ne comprends pas bien ce que vous cherchez à faire. En effet dans votre exemple vous déclarez une variable Tata et Coul qui seront écrasées à chaque tour dans votre boucle. Pour créer un objet voiture, l'ajouter à une liste parking et boucler sur tous les éléments de la liste, vous pouvez exécuter le code suivant :

    Module Module1
    
      Public Class Voiture
    
        Public Couleur As String
    
      End Class
    
      Public Parking As New List(Of Voiture)
    
      Sub Main()
    
        Dim Coul As String
        Dim tata As New Voiture
        tata.Couleur = "Rouge"
        Parking.Add(tata)
    
        For Each voiture As Voiture In Parking
    
          Coul = voiture.Couleur
          Console.WriteLine(Coul)
    
        Next
    
        Console.ReadLine()
    
      End Sub
    
    End Module
    
    Cordialement

    lundi 27 décembre 2010 10:58
    Modérateur
  • Bon apparemment j'ai trouvé le problème.

    La classe voiture contenait aussi un autre champ nommé Keys.

    Public Class Voiture

         Public Couleur as string

         Public Keys As New Dictionary(Of String, String)

    End class

    Comme j'utilisais aussi par la suite le champ Keys dans la routine  (même nom que des fonctions VB), je l'ai remplacé par Cles et depuis plus de problèmes.

    Public Class Voiture

         Public Couleur as string

         Public Cles As New Dictionary(Of String, String)

    End class

    Je peux maintenant récupérer la valeur de Voiture.couleur.

    Ce qui était  bizarre, c'est que je pouvais imprimer la valeur de Voiture.Couleur dans la fenêtre exécution, en débogage, en faisant ?Voiture.couleur

    mais le test [String].IsNullOrEmpty(voiture.couleur) dans le code, renvoyait True.

    Certainement une confusion de nom par l'interpréteur de code VB.

     

    Par contre j'utilise des champs plutôt que des proriétés avec Get et Set (A noter que le bug était identique en utilisant property Get et set).

    Qu'elle est la différence entre un Champ et une propriété lorsque le set et le get de cette propriété sont définis?

     

    Cordialement.


    • Marqué comme réponse Alex Petrescu mardi 4 janvier 2011 10:00
    • Non marqué comme réponse Alex Petrescu mardi 4 janvier 2011 10:00
    lundi 27 décembre 2010 13:38
  • Une propriété permet d'exposer en général publiquement un champ privé. Quand vous utilisez le mot clé Property sans préciser le get /set , le compilateur l'écrit pour vous.

    Ainsi si vous utilisez reflector pour voir le code généré :

    Public Property Libelle As String
    
    devient

    Public Property Libelle As String
      <DebuggerNonUserCode> _
      Get
        Return Me._Libelle
      End Get
      <DebuggerNonUserCode> _
      Set(ByVal AutoPropertyValue As String)
        Me._Libelle = AutoPropertyValue
      End Set
    End Property
    
     
    
    

    Il est de "tradition" de ne pas exposer publiquement des variables privées même si cela fait évidemment débat : Properties vs. Public Variables

    Le fait est que comme il en est fait mention dans le lien ci dessus :

    - vous ne pouvez pas utiliser la reflection de la même façon entre un champ et une propriété

    - transformer un champ en propriété ( et vice versa ) oblige à recompiler

    - le databinding ne fonctionne que sur les propriétés

     

    Cordialement

     

     

    • Proposé comme réponse EhJoe mercredi 29 décembre 2010 21:18
    lundi 27 décembre 2010 14:18
    Modérateur
  • Encore pour dire que le bug ne venait pas de Keys, j'avais changé deux choses en même temps.

    Il provient de With .

    With TaTa

      For Each TaTa in Parking

         Coul=.Couleur

      Next

    End with

    Cet exemple ne permet pas d'écrire dans Coul.

     

    Celui là fonctionne .

      For Each TaTa in Parking

         Coul=TaTa.Couleur

      Next

     

    Je repose la question précédente.

    Qu'elle est la différence entre un Champ et une propriété lorsque le set et le get de cette propriété sont définis?

     

    Cordialement.

    • Marqué comme réponse Alex Petrescu mardi 4 janvier 2011 10:00
    • Non marqué comme réponse Alex Petrescu mardi 4 janvier 2011 10:01
    lundi 27 décembre 2010 14:22
  • Utilisez les boucles comme proposés dans l'exemple de Thomas ou le mien. Pour le moment vous utilisez la même variable TaTa comme variable locale en dehors et dans le scope de la boucle . L'utilisation du With ne fait que rajouter un nouveau problème.

    For Each toto In Parking
    
          With toto
            Coul = .Couleur
            Console.WriteLine(Coul)
          End With
    
    Next
    

    lundi 27 décembre 2010 15:00
    Modérateur
  • Les Propriétés exposent les Champs. Les Champs doivent quasiment toujours être gardés privés et n'être accédés que par le get et le set de la Propriété. Les Propriétés permettent donc de changer les Champs sans pour autant affecter la façon dont on y accède. C'est donc une couche d'abstraction qui permet de se rendre indépendants des Champs de l'objet.

    Public Class [MaClasse]
      ' Ceci est un Champ. Il est privé dans la classe et sert à stocker une donnée.
      Private _monChamp As String
    
      ' Ceci est une Propriété. Quand on y accède, elle utilise le Champ sous-jacent.
      ' En fait c'est un contrat(lecture et/ou écriture) qui dans tous les cas n'est jamais affecté par la valeur du Champ.
      Public Property MonChamp() As String
        Get
          Return _monChamp
        End Get
        Set
          _monChamp = value
        End Set
      End Property
    End Class
    

     

     


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    • Marqué comme réponse Alex Petrescu mardi 4 janvier 2011 10:01
    mercredi 29 décembre 2010 11:23