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 :

problème lors d'une conversion d'une structure en classe


Sujet :

C#

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 42
    Points : 39
    Points
    39
    Par défaut problème lors d'une conversion d'une structure en classe
    salut,

    suite au conseil de transformer mes structures en classes dans un autre topic, je me suis exécuté et retrouvé fasse à un problème bizarre:

    voici la classe qui était une structure

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
        public class Entree
        {
     
            private double montant;
            private string lieu;
            private string type;
            private string motsCle;
            private DateTime date;
            private int id;       
     
     
            public double Montant
            {
                get { return montant; }
                set { montant = value;}
            }
            public string Lieu
            {
                get { return lieu; }
                set { lieu = value; }
            }
     
            public string Type
            {
                get { return type; }
                set { type = value; }
            }
     
            public string MotsCle
            {
                get { return motsCle; }
                set { motsCle = value; }
            }
     
            public DateTime Date
            {
                get { return date; }
                set { date = value; }
            }
            public int Id
            {
                get { return id; }
                set { id = value; }
            }
        }
    et le code l'utilisant:

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
      private List<Entree> tab = new List<Entree>();
     
            public Donnees(){
     
                if (File.Exists(fileName))
                {
                    BinaryReader binReader = new BinaryReader(File.Open(fileName, FileMode.Open));
                    try
                    {
                        // determine if the file is empty.
                        byte[] testArray = new byte[3];
                        int count = binReader.Read(testArray, 0, 3);
     
                        if (count != 0)
                        {
                            // Reset the position in the stream to zero.
                            binReader.BaseStream.Seek(0, SeekOrigin.Begin);
                            SeekOrigin i = SeekOrigin.Begin;
                            Entree e = new Entree();
     
     
                            while (i != SeekOrigin.End)//on lit jusqu'a la fin du fichier
                            {             
                                e.Lieu = binReader.ReadString();
                                e.Type = binReader.ReadString();
                                e.MotsCle = binReader.ReadString();
                                e.Montant = binReader.ReadDouble();
                                e.Date = DateTime.FromFileTime(binReader.ReadInt64());
                                e.Id = binReader.ReadInt32();
                                i = SeekOrigin.Current;
     
                                tab.Add(e);
                            }          
                        }
                    }
                    catch{                   
                    }
                    finally
                    {
                        binReader.Close();
                    }
                }
            }
    Avec une structure, ce code fonctionne parfaitement. Si je remplace struct par class, toute ma liste vaut la dernière valeur lue dans le fichier. pourtant il ne devrais pas y avoir de différences

  2. #2
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Normal puisque tu ne crées qu'une seule instance de ta classe. Et c'est cette même instance que tu modifies et ajoutes à chaque tour de boucle. Au final tu te retrouves avec X fois la même instance dans ta liste. Instancie la classe dans la boucle et ça ira beaucoup mieux

    Et lire un petit cours pourrait être utile

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 42
    Points : 39
    Points
    39
    Par défaut
    si je met

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Entree e = new Entree();
    dans ma boucle, est ce que ça ne va pas recréer un objet entrée à chaque fois pour rien ?

    j'ai lu un cours, mais il y a beaucoup de choses pas très claires

  4. #4
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Ca ne peut pas le créer pour rien, puisque tu en as besoin. Ta liste de classes doit avoir une référence sur une instance spécifique pour chaque entrée.
    Quand tu utilises une structure, tu n'en créés qu'une seule instance et ça fonctionne car à chaque passage en paramètre dans une méthode, ta structure est copiée champ par champ (les pointeurs sont copiés pour les champs de type référence). L'exemple à deux balles pour comprendre ça est le suivant :

    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
    27
    28
    29
    30
    31
    32
     
    struct MaStruct
    {
        public double Toto
        { get; set; }
    }
     
    public class MaClass
    {
        public double Toto
        { get; set; }
    }
     
    ... ...
     
    private void Do(MaStruct stru, MaClass cla)
    {
       stru.Toto = 5;
       cla.Toto = 5;
    }
    ...
     
    MaStruct s = new MaStruct();
    MaClass c = new MaClass();
     
    s.Toto = 10;
    c.Toto = 10;
     
    Do(s, c);
     
    //Ici, s.Toto est toujours égal à 10, tandis que c.Toto est égal à 5
    .... ...

  5. #5
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Citation Envoyé par kronoss1
    est ce que ça ne va pas recréer un objet entrée à chaque fois pour rien ?
    C'est une question de logique. Il faut ajouter des objets différents à chaque tour de boucle, sinon tu auras une liste avec la même instance répétée X fois. Qu'est ce qui te semble étrange la dedans ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 42
    Points : 39
    Points
    39
    Par défaut
    merci pour vos explications c'est beaucoup plus clair

    désolé si mes questions sont assez basiques, mais je suis en plein apprentissage

  7. #7
    Membre confirmé Avatar de MetalGeek
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 412
    Points : 513
    Points
    513
    Par défaut
    Citation Envoyé par kronoss Voir le message
    désolé si mes questions sont assez basiques, mais je suis en plein apprentissage
    Y'a pas de souci, on est là pour ça et en plus je crois que tant qu'on programme, on est continuellement en apprentissage...

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

Discussions similaires

  1. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  2. Réponses: 0
    Dernier message: 07/04/2010, 19h15
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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