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 :

Mettre à jour les propriété d'une List<struct>[i] ?


Sujet :

C#

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut Mettre à jour les propriété d'une List<struct>[i] ?
    Bonjour,

    J'ai le code suivant (en gros) :

    Code c# : 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
     
    struct Test
    {
       int a = 0;
       string b = string.Empty;
    }
     
    List<Test> liste = new List<Test>();
     
    liste.add(new Test());
    liste.add(new Test());
    liste.add(new Test());
     
    for (int i = 0, cpt = liste.Count; i < cpt; i++)
    {
        liste[i].a = i; // plante
        liste[i].b = string.Format("Test {0}", i); // plante
    }

    J'ai l'erreur de compilation suivante :

    Error 2 Cannot modify the return value of 'System.Collections.Generic.List<CommonTools.User>.this[int]' because it is not a variable C:\Git\UpdateSync\UpdateTools\UpdateExtractor.cs 391 29 UpdateTools


    Kézako ?

    Pourquoi j'ai pas le droit de modifier les propriétés des structures contenues dans ma liste ?

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 170
    Points : 7 422
    Points
    7 422
    Billets dans le blog
    1
    Par défaut
    Grmpf.

    En fait, j'ai remplacé struct par class et j'ai plus de problème.
    Donc je vais pas chercher plus loin...

  3. #3
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    En ce qui concerne l'explication ; lorsqu'il s'agit de structures tu récupères en fait une copie des éléments, donc liste[i] n'est pas l'élément de ta liste mais la copie de l'élément de ta liste.
    Par conséquent en modifiant son "a" ou son "b" tu ne modifierais que celui de la copie (et l'élément de ta liste resterait inchangé) ; et donc après la ligne en question la modification serait perdue (vu que tu ne stockes pas cette copie).
    Visual Studio détecte ce cas de figure et te le signale (car il y a de grandes chances que tu veuilles modifier l'original plutôt que modifier une copie que tu ne conserves pas)

    Tu peux donc, comme tu l'as fait utiliser une classe (car dans ce cas en faisant liste[i] tu récupères une copie, mais une copie de la référence vers le même objet donc les modifications sur la copie se répercute sur l'original vu qu'ils font référence à la même chose).
    L'autre possibilité aurait été de conserver une structure, mais stocker d'abord la copie, puis faire les modifications et enfin remplacer l'original par sa copie.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    En fait, j'ai remplacé struct par class et j'ai plus de problème.
    Donc je vais pas chercher plus loin...
    Bah justement ça vaut le coup d'aller chercher plus loin... La différence entre types référence (classes, délégués, interfaces) et types valeur (structures, enums) est une notion souvent mal comprise et pourtant très importante. L'explication de Sensucht est correcte.

    De toutes façons, en pratique il est rarement utile de créer des structures plutôt que des classes, sauf dans des scénarios très spécifiques.

    De plus, il est vivement déconseillé de créer des structures "mutables", car ça peut causer toutes sortes de bugs ; si vraiment tu dois utiliser une struct, essaie de t'arranger pour qu'elle ne soit pas modifiable. Pour les explications, regarde ces questions sur Stackoverflow:


Discussions similaires

  1. [PPT-2010] mettre à jour les nombres dans une phrase
    Par pepsister dans le forum Powerpoint
    Réponses: 1
    Dernier message: 14/06/2010, 10h32
  2. Mettre à jour les propriétés des formulaires
    Par rj450 dans le forum VBA Access
    Réponses: 2
    Dernier message: 23/03/2010, 10h41
  3. mettre-à-jour l'ID d'une liste
    Par lesanglier dans le forum SharePoint
    Réponses: 6
    Dernier message: 05/01/2010, 13h55
  4. Définir les propriétés d'une liste <select>
    Par Sytchev3 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 19/10/2007, 14h14
  5. Mettre à jour les lignes d'une colonne dans dataTable
    Par Mikelester12 dans le forum VB.NET
    Réponses: 2
    Dernier message: 19/07/2007, 08h31

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