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 :

Modification de structure


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut Modification de structure
    Bonjour à tous,

    Je suis en train de concevoir un programme en C# qui utilise des structures.

    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
    Exemple de structure :
            public struct Personne
            {
                public int id;
                public string name;
    
                public Personne(int id, string name)
                {
                    this.name= name;
                    this.id= id;
                }
    
                public int ID
                {
                    get { return this.id; }
                    set { this.id= value; }
                }
    
                public string Name
                {
                    get { return this.name; }
                    set { this.name= value; }
                }
            }
    Je parviens bien à créer une instance de ma structure...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     System.Collections.Generic.Dictionary<int, Personne> pers = new System.Collections.Generic.Dictionary<int, Personne>();
     pers.Add(1,new Personne(1,"toto");
    ... toutefois, je ne parviens pas à modifier les variables qui la compose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    pers[1].ID = 2;
    pers[1].Name = "titi";
    Erreur : Impossible de modifier la valeur de retour de 'System.Collections.Generic.Dictionary<int, Personne>.this[int]', car il ne s'agit pas d'une variable.

    Quelqu'un pourrait-il m'expliquer et/ou m'orienter vers une solution afin de pouvoir modifier les variables ?

    Merci

  2. #2
    Membre averti Avatar de emiscool
    Profil pro
    architecte logiciel
    Inscrit en
    Octobre 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : architecte logiciel

    Informations forums :
    Inscription : Octobre 2006
    Messages : 45
    Par défaut
    tu pourra modifier les éléments de ton objet Dictionary via la méthode suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Personne p = new Personne(2, "titi");
    pers[1] = p;


    pour plus d'information sur l'utilisation du type Dictionary , voila un lien http://msdn.microsoft.com/fr-fr/libr...08(VS.80).aspx

  3. #3
    Rédacteur

    Avatar de Jérôme Lambert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2003
    Messages
    4 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 4 451
    Par défaut
    La raison pour laquelle il n'est pas possible de faire ce que tu fais, c'est tout simplement que l'indexeur ([x]) te renvoie une copie de ton objet (étant donné qu'il s'agit d'un type valeur).

    Le compilateur c# interdit donc cette opération car l'affectation d'une nouvelle valeur sur une propriété de l'objet retourné ne servira à rien, vu que tu vas le faire sur une copie.

    La bonne façon de faire est bien celle indiquée par emiscool :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Personne newPer1 = new Personne ();
    newPer1 .ID = 2;
    newPer1 .Name = "titi";
    pers[1] = newPer1;
    Pour plus d'information sur l'erreur générée par le compilateur : http://msdn.microsoft.com/fr-fr/library/wydkhw2c.aspx

  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
    Par défaut
    Je confirme l'explication de Jérôme, je voudrais juste ajouter quelques commentaires...

    - Pourquoi utiliser une structure dans ce cas ? Les structures sont des types valeurs, elles sont à utiliser quand tu veux donner à ton type une sémantique de valeur. Une personne ne correspond pas vraiment à ce cas d'utilisation... Si tu veux passer une personne en paramètre d'une méthode, ça n'a pas de sens de passer une copie de la personne, il vaudrait mieux passer une référence. Si tu ne comprends pas vraiment ce qu'implique l'utilisation d'une structure par rapport à une classe, choisis toujours une classe, tu auras moins de surprises

    - Evite de déclarer des champs publics dans une classe ou une structure. Les champs devraient toujours être privés (sauf à la rigueur les champs static readonly dans certains cas), et n'être accessibles que via des propriétés. Tu as déjà créé les propriétés, tu n'as donc plus qu'à rendre les champs privés.

  5. #5
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 52
    Par défaut
    Pour répondre à tomlev, c'est la première fois que j'utilise des structures en .NET. J'ai choisi cela car j'ai vu quelque part que les structures occupent moins de ressources que les classes.

    Finalement, au vu de ce que je souhaite réaliser, je pense que je vais opter pour des classes.

    Je vous remercie pour toutes vos réponses explicatives.

  6. #6
    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
    Par défaut
    Citation Envoyé par Iloyo Voir le message
    J'ai choisi cela car j'ai vu quelque part que les structures occupent moins de ressources que les classes.
    Je ne sais pas où tu as vu ça, mais ce n'est absolument pas vrai...

    Il y a beaucoup d'idées fausses très répandues sur les types valeurs en .NET, genre "les types valeurs sont alloués sur la pile"... Si tu comprends l'anglais je te conseille de lire ces articles :
    http://blogs.msdn.com/b/ericlippert/...lue-types.aspx
    http://blogs.msdn.com/b/ericlippert/...lue-types.aspx

  7. #7
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je ne sais pas où tu as vu ça, mais ce n'est absolument pas vrai...
    Ce n'est pas absolument faux non plus, au moins sur l'implémentation de Microsoft, si le value type n'est pas alloué sur le tas, il ne possède pas de sync block index, ni de Type Object Pointer. C'est peut être négligeable (on parle de quelques bytes) mais ça rend ton affirmation en partie fausse. Qui plus est, à la défense du PO, même des grands noms comme Jeffrey Richter font l'amalgame (ou plûtot la généralité) de dire que les value type sont alloués sur la pile à moins d'être boxé ou faire partie d'un reference type (voir CLR via C# 3ème édition, page 121).
    Cela étant dit, il ne fait aucun doute dans ce cas précis que le type Personne doit être une classe et non une structure.
    Cordialement.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 08/12/2008, 19h01
  2. [9i] Modification de structure => transaction
    Par 6rose dans le forum Administration
    Réponses: 3
    Dernier message: 12/07/2007, 14h56
  3. [SQL2K] Répercuter les modifications de structure
    Par frechy dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 06/02/2007, 15h18
  4. Modif auto structure (accent, espace) / routine
    Par LostIN dans le forum Access
    Réponses: 16
    Dernier message: 04/07/2006, 10h40
  5. [XSL-FO] Modifer une structure de tableau dans for-each
    Par serwol dans le forum XSL/XSLT/XPATH
    Réponses: 24
    Dernier message: 17/06/2005, 17h38

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