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

VB.NET Discussion :

[VB.NET] Assignation d'un élément d'une liste (structure)


Sujet :

VB.NET

  1. #1
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut [VB.NET] Assignation d'un élément d'une liste (structure)
    Toujours le même probleme mais en différent ...

    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Structure ArretsGPS
        Public duree As Integer
        ...
    End Structure
     
    Dim azaz As New List(Of ArretsGPS)
    Dim valArret As ArretsGPS
    With valArret
        .duree = 2
    End With
    azaz.Add(valArret)
    azaz(0).duree = 0 ' -> "Cette expression est une valeur et ne peut donc pas être la cible d'une assignation."

    Le compilateur affiche une erreur (sans compiler) sur la dernière ligne et je n'arrive pas a comprendre pourquoi.

    Peut-on m'aider ?
    merci

  2. #2
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Apres pas mal de recherches, de prise de tete, etc .. il semblerait que j'ai trouvé une méthode qui fonctionne ...

    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Class CArretGPS
        Public duree As Integer
        ...
    End Class
     
    Dim azaz As New List(Of CArretGPS)
    Dim valArret As New CArretGPS
    With valArret
        .duree = 2
    End With
    azaz.Add(valArret)
    azaz(0).duree = 0

    Je n'ai pas vraiment compris pourquoi une classe passait mieux qu'une structure (valeur / référence), mais je n'ai plus d'erreur, ni avant la compilation, ni a l'éxécution ...

    La source qui m'a bien aidé : http://www.thescripts.com/forum/thread453112.html

    Si des personnes ont une explication plus claire ...

  3. #3
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    mon explication :

    La stucture est un type valeur, donc quand tu lui accede à partir de la List tu obtient une copie, donc en fait tu vas changer la valeur de la copie et non pas de la structure inserée dans la liste, et puisque le compilo est assez intelligent il a prévu donc cette maladresse

  4. #4
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    mouais

    Que je ne dise pas de bétises : .net est bien le seul a avoir une gestion des structures comme ca, non ?
    Parce que pour moi, je ne trouve pas ca très clair et pratique ... et je ne suis jamais tombé sur ce genre de cas dans d'autres langages

    merci

  5. #5
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Non non, c'est pas spécifique au C#.
    En C++ c'est pareil.
    En Java aussi j'imagine, sinon je ne vois pas bien à quoi ça sert d'avoir des structures et des classes.

    Pourquoi tu fais des structures et pas des classes ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    .Net est un des "langages" ou on peut spécifier explicitement la gestion des variables par valeur ou par référence lors de la définition du type: struct = par valeur , class = par référence. On peut trouver ça étrange et déroutant mais en tout ça fait parti des choses à savoir qd on utilise un langage .

    C++ n'est pas pareil, en C++ tout est traité par valeur, struct ou class même combat. Pour avoir des références il faut utiliser le symbole "&" lors de la déclaration d'une variable (ou bien utiliser des pointeurs pour obtenir qque chose d'équivalent).
    En Java il me semble qu'au tout début même les types de base (entier, caractère etc...) étaient gérés par référence et le programmeur ne pouvait pas créer de types valeur. Maintenant les types de base sont des types valeur, je crois qu'on peut définir des types valeur également. Qu'un spécialiste java me corrige si je dis des bêtises .

  7. #7
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    Citation Envoyé par Sphax
    C++ n'est pas pareil, en C++ tout est traité par valeur, struct ou class même combat. Pour avoir des références il faut utiliser le symbole "&".
    Ah ouaaaaaaaaaais ça me reviens bien maintenant.
    Rholalalala, qu'est ce qu'on est bien en C#

    Ceci dit, en C++ il y a des raisons concrètes d'utiliser des structures ou des unions plutôt que des classes pour des raisons pratiques de gestion de mémoire, ce qui n'est pas vraiment le cas en C#, langage de plus haut niveau avec un runtime évolué, où les classes sont gérées totalement différemment du C++.

  8. #8
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Merci pour vos réponses.

    Mais y'a pas à dire : je ne trouve pas du tout ca "explicite" les passages par valeurs ou reférences en .net ...
    J'ai touché plusieurs langages et je ne m'étais jamais posé ce genre de questions .... vraiment bizarre je trouve

    Je dévie légèrement du sujet pour poser ces questions :
    le type String, le type Objet, le type integer ... par valeur ou référence ?

    Imaginons que j'ai un objet contenant une classe qui contient elle-meme un String :
    listObj(0) <=> String

    Si je fais :
    Code vb.net : Sélectionner tout - Visualiser dans une fenêtre à part
    dim str as String = listObj(0)
    Cela fait une copie ou une référence a la variable de départ ?
    Idem pour d'autres types ...

    Comme vous le voyez, je suis un peu paumé la ^^

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Mais y'a pas à dire : je ne trouve pas du tout ca "explicite" les passages par valeurs ou reférences en .net ...
    J'ai touché plusieurs langages et je ne m'étais jamais posé ce genre de questions .... vraiment bizarre je trouve
    C'est pas trés intuitif au premier abord mais ça permet plus de contrôle. Il faut voir ce qu'il y a derrière la distinction valeur/référence.
    Un type valeur est alloué sur la pile ce qui implique une allocation/désallocation rapide sans intervention du garbage collector et une assignation de type valeur ou un passage en paramètre de fonction (ou valeur de retour) va effectuer une copie de l'objet.
    Un type référence est alloué sur le tas, sa mémoire devra être réclamée par le garbage collector. Une assignation ou un passage de paramètre d'un type référence ne copie (par défaut) que la référence, pas l'objet lui même.
    Tout ça peut avoir un fort impact sur les performances d'une application en fonction du modèle choisi (valeur ou référence) et en fonction du type de l'application (par exemple une appli trés mathématique qui manipule beaucoup de petits objets comme des vecteurs/matrices aurait surement intéret à utiliser des struct plutot que des class pour ces objets).

    le type String, le type Objet, le type integer ... par valeur ou référence ?
    String : référence
    Object : référence
    Integer : valeur

    Tu peux savoir tout ça en regardant la classe de base de ces objets : tous les types valeurs doivent dériver de la classe ValueType, pas les types référence.

  10. #10
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    oki merci ...

    Si je comprends bien, il va falloir que je change tous mes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim string1 as string = "coucou"
    Dim string2 as string
    string2 = string1
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim string1 as string = "coucou"
    Dim string2 as string
    string2 = String.copy(string1)
    ?

    Je le sens trop pas ce truc ... je sens quue mon application va exploser ...
    Il faut dire aussi que dans beaucoup de langages String est un type de base comme Integer ... Existe t-il d'autres types connus comme String qui risquent de faire exploser mon appli ?

    PS : et le constructeur de String il est ou ? On ne fait pourtant pas de new ....

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Les chaines de caractères sont traitées de manières particulières par le framework. Déja il faut noter que ce sont des objets "immutables" c'est à dire que tu ne peux jamais modifier une chaîne de caractère une fois celle-ci créée. Ensuite qd tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim string1 as string = "coucou"
    Le compilateur se charge de créer une chaîne contenant "coucou" et il copie la référence à cette chaîne dans ta variable string1. C'est une syntaxe simplifiée pour les string qui sont trés utilisées (d'ailleurs on a les mêmes facilités pour tous les types de base, tu n'écris pas : dim I as Integer = new Integer(10) mais c'est bien ce que fait le compilateur/framework).

    Je ne vois pas l'intéret de dupliquer toutes tes chaines de caractères ? Par contre pour d'autres types d'objets, si tu pensais que la copie se faisait par valeur tu risques d'avoir de ssoucis oui...

  12. #12
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Je vais essayer d'etre plus clair

    Voila en gros mon code :

    Code vb.net : 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
    Public Class CArretGPS
        Public nomParcours As String
        Public latitude As Double
        ...
    End Class
     
    ...
     
    ' listeArrets2 existe et contient deja des éléments ....
    Dim listeArrets2 As List(Of CArretGPS)
     
    Public Sub Truc()
        Dim listeArrets As New List(Of CArretGPS)
        Dim valArret As New CArretGPS
     
        valArret.nomParcours = "Parcours1"
        valArret.latitude = 5
        listeArrets.Add(valArret)
     
        ' Est-ce que cette ligne de code peut poser problème ? (affectation de String)
        listeArrets2(0).nomParcours = listeArrets(0).nomParcours
        ' Dans tous les cas, cette ligne par contre ne devrait pas poser de soucis, non ? (affectation par valeur)
         listeArrets2(0).latitude = listeArrets(0).latitude
        ...
    End Sub

    Dans l'exemple ci-dessus, je me pose la question si l'affectation d'une String a une autre peut me poser des soucis plus tard ?!
    En gros, si il s'agit de la même variable (référence) ou d'une copie ?

    Merci !

  13. #13
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    En gros, si il s'agit de la même variable (référence) ou d'une copie ?
    Il s'agit de la même référence, mais avec les string ça ne doit pas te poser de problème puisqu'elles sont immutables (tu ne peux pas les modifier). Pas de soucis à partager des objets immutables, tu vois ce que je veux dire ?

  14. #14
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Oui, je commence a comprendre ... mais si je comprends bien, dans le cas ou je modifie une des 2 string, l'autre ayant la même référence, il y a risque qu'elle prenne la même valeur, non ? ..

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Non, comme une string n'est pas modifiable, tout ce que tu peux faire c'est assigner une nouvelle référence vers une nouvelle string a tes variables, et donc elles ne partageront plus les mêmes objets à ce moment là.

  16. #16
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    ok ! donc la référence sera modifiée pour la variable modifiée (et uniquement celle-la) !
    Tain c'est chelou tout ca J'ai quand même du mal ...
    Bon pour les objets (de ma classe, d'ArrayList), j'ai fais gaffe, normallement je fais des copies d'objet ...
    Ca "devrait" pas exploser alors ...

  17. #17
    Membre expérimenté Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Points : 1 379
    Points
    1 379
    Par défaut
    En fait, la string faut la voir comme un ValueType furtif (qui n'hérite pas de ValueType)

  18. #18
    Membre expérimenté
    Avatar de Mehdi Feki
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 113
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 113
    Points : 1 566
    Points
    1 566
    Par défaut
    Citation Envoyé par Sphax
    Maintenant les types de base sont des types valeur
    je confirme, en java pour faire des passages par référence il faut alors encapsuler la variable dans une classe ou la passer dans un tableau.

    pour l'histoire du string si vous répondez à cette question alors vous serez certifé microsoft string specialist

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    string s = "I";          
    s += " have"  ;
    s += " a"       ;
    s += " dream" ;
    Combien de références string ont été utilisées ?
    Combien il en restera à la fin ?
    Où sont elles allées les références perdues ?
    Comment remedier à ce probleme ?

    A+

  19. #19
    Membre actif

    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2003
    Messages
    286
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 286
    Points : 255
    Points
    255
    Par défaut
    Combien de références string ont été utilisées ?
    Combien il en restera à la fin ?
    Où sont elles allées les références perdues ?
    Comment remedier à ce probleme ?
    euh .... tentons
    1) 4
    2) 1
    3) euhm .... On est en code managé ... Le CLR a créé de nouvelles références à chaque fois. Les références qui ne sont plus utilisés sont gérés par le garbage collector qui vide "a peu près quand il veut" .
    4) en codant dans un autre langage que .net ? En implémentant une interface pour libérer l'objet (disposable) ou un truc comme ca ?

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Sans optimisation du compilateur, je dirais

    1) 7 (à cause des chaines intermédiaires de chaque +=)
    2) 5 (ces mêmes chaines intermédiaires vont être garbage collectées)
    3) comme dit plus haut certaines des références vont être garbage collectées (les valeurs intermédiaires) , les chaines litérales sont stockées dans un endroit particulier par le CLR si je ne me trompe pas afin de pouvoir être réutilisées (mécanisme de string interning).
    4) En écrivant string s = "I have a dream" (si le compilateur n'optimise pas déja comme ça ...)

Discussions similaires

  1. CSLA.Net : Impossible de supprimer un élément d'une liste
    Par dogua dans le forum Accès aux données
    Réponses: 4
    Dernier message: 11/06/2013, 17h18
  2. [vb.net] Ajustement automatique des éléments d'une form
    Par solid_sneak06 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 12/03/2009, 18h21
  3. [CSS]Changer l'interligne des éléments d'une liste à puces
    Par khany dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 21/03/2005, 13h57
  4. Réponses: 2
    Dernier message: 11/01/2005, 14h10
  5. [IDE][VS.NET 2003] Y a-t-il une liste des racourcis ?
    Par 404Found dans le forum Contribuez
    Réponses: 2
    Dernier message: 22/06/2004, 20h20

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