generische Liste wird mit letzten werten überschrieben

Beantwortet generische Liste wird mit letzten werten überschrieben

  • Montag, 22. Oktober 2012 09:11
     
      Enthält Code

    Hallo, ich lesen einige daten aus einer xml datei ein.  Hier der C# code:

    while (reader.Read())
                {
                    if (reader.NodeType == XmlNodeType.Element)
                    {
                        if (reader.Name == "Programm")
                        {
                            if (reader.HasAttributes)
                            {
                                while (reader.MoveToNextAttribute())
                                {
                                    if (reader.Name == "Dateipfad")
                                    {
                                        attribut.sDateipfad = reader.Value;
                                    }
                                    else if (reader.Name == "Bezeichnung")
                                    {
                                        attribut.sBezeichnung = reader.Value;
                                    }
                                    else if (reader.Name == "Wartezeit")
                                    {
                                        bool ergebnis;
                                        ergebnis = Int32.TryParse(reader.Value,out attribut.iWartezeit);
                                    }
                                }
                                startattribute.Add(attribut);
                            }
                        }
                    }
                }

    leider steht in der Generischen liste (startattribute) in jedem element immer das gleiche drin und zwar das was zuletzt eingelesen wurde. Warum?

    Weis jemand warum das so ist?

Alle Antworten

  • Montag, 22. Oktober 2012 09:20
     
     

    Habe nun den codes so geändert, dass die form attribut bei jedem element neu erzeugt wird, dann hat es funktioniert. (Also im Block  if (reader.HasAttributes))

    dirket eine klasse vom typ startattribute erzeugt.  wieso geht das nicht, wenn diese schon davor erzeugt wurde? ich überschreibe sie doch mit den readerwerten.

  • Montag, 22. Oktober 2012 09:59
     
     
    Hallo, wenn du mit new eine neue Instanz anlegst, so wird ein neuer Bereich im Arbeitsspeicher für deine Variable (Program) reseviert. Wenn du die Varaiable einer Liste hinzufügst, wird sozusagen ein Verweis auf den Bereich in dr Liste gespeichert. Wenn du nun die Variable änderst, änderst du den alten Bereich des Arbeitsspeichers und die Liste enthält immer wieder das selbe. Du musst also für jedes Attribut eine neue Instanz erstellen., damit auch neuer Arbeitsspeicher resveriert wird und entsprechend nicht der selbe Verweis in der Liste landet.

    Koopakiller - http://koopakiller.ko.ohost.de/

  • Montag, 22. Oktober 2012 18:53
     
     
    Also wenn ich Variable a zu einer liste adde und anschließend a verändre verändere ich auch das Element in der liste? Warum? Wenn ich b=a; und anschließend a=5 schreibe ist doch b auch nicht 5, sondern hat den vorherigen Wert von a. Warum ist es also bei den Listen so? Würde es gerne wissen, nicht nur so anwenden. ;-)
  • Montag, 22. Oktober 2012 19:02
     
     Beantwortet Enthält Code

    Hallo, i deinem Beispiel resdest du von einer simplen Zahl, ein Basisdatentyp. Diesen brauchst du auch nicht mit new zu erstellen.

    int a = 0;
    int b = a;
    a = 2;
    
    // a = 2
    // b = 0
    
    //////////////////////////////////////////////////
    
    class cls
    {
        public int a { get; set; }
    }
    
    cls a = new cls();
    a.a = 0;
    cls b = a;
    a.a = 2;
    
    // a.a = 2
    // b.a = 2;
    
    /////////////////////////////////////////////////
    
    
    struct strct
    {
        public int a { get; set; }
    }
    
    strct a = new cls();
    a.a = 0;
    strct b = a;
    a.a = 2;
    
    // a.a = 2
    // b.a = 0;

    Also gelten diese "Verweise" nur bei Klassen, aber nicht bei Basisdatentypen oder Strukturen.


    Koopakiller - http://koopakiller.ko.ohost.de/


  • Donnerstag, 15. November 2012 18:14
    Besitzer
     
     

    Hallo Bensen83,

    Ich gehe davon aus, dass die Antwort Dir weitergeholfen hat.
    Solltest Du noch "Rückfragen" dazu haben, so gib uns bitte Bescheid.

    Grüße,
    Robert


    Robert Breitenhofer, MICROSOFT   Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip Entwickler helfen Entwickler“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.