Entwickler-Ecke
Basistechnologien - Listenzustand merken
Max064 - Do 22.07.10 12:11
Titel: Listenzustand merken
Hallo,
ich erstelle eine List von Objekten mit der Klasse list<>. An einer bestimmten Stelle des Programms setzte ich diese Liste einer 2. Liste gleich. Damit möchte ich eigentlich den Zustand der 1. Liste in der 2. Liste speichern.
Doch wenn ich nach dem Gleichsetzen die 1.Liste auf irgendeineweise verändere, verändert sich die 2. Liste auch mit, obwohl keine weitere Gleichsetzung stattfindet.
Warum ist das so bzw. wie kann ich dies verhindern?
lg Marcel
Th69 - Do 22.07.10 12:39
Wie setzt du die beiden Listen gleich?
So etwa:
C#-Quelltext
1: 2: 3:
| List<X> x = new List<X>();
List<X> y = x; |
?
Alle Klassen in C# sind Referenztypen, daher ist im obigen Fall y nur ein Synonym für x.
Abhilfe könnte hier
C#-Quelltext
1:
| List<X> y = new List<X>(x); |
schaffen, dadurch erzeugst du eine neue Liste mit den Verweisen auf die Originallisteneinträge.
Wenn du jetzt jedoch einen Listeneintrag in x veränderst (sofern X eine Klasse ist), so wird auch weiterhin der entsprechende Eintrag in der Liste y mit verändert.
Du solltest dir also nochmal in dem C#-Buch deiner Wahl den Unterschied zwischen Referenz- (class) und Werttypen (struct) anschauen.
Max064 - Do 22.07.10 13:36
Hi,
erstmal vielen Dank auf den Verweis von Wertetypen und Referenztypen! Warum das Problem auftaucht ist damit schonmal gelöst ;-)!
Bisher habe ich die Zuweisung folgendermaßen durchgeführt:
C#-Quelltext
1: 2: 3: 4: 5:
| List<Klasse> x = new List<Klasse>(); List<Klasse> y = new List<Klasse>(); ...
y=x; |
Damit ändere ich also den Zeiger von y und habe damit logischerweise IMMER den gleichen Inhalt wie x. Also muss ich irgendwie den Inhalt in den Heap meiner Liste y kopieren. Dafür würde sich MemberwiseClone oder GetRange anbieten?! Oder gibt es da bessere/ geschicktere Methoden.
danielf - Do 22.07.10 13:49
Hallo,
es gibt die AddRange-Methode oder gleich bei der Initiierung als Konstruktor-Parameter.
Gruß
Max064 - Fr 23.07.10 09:00
Hi,
die AddRange Methode funktioniert wunderbar! Danke!
Ich habe auch versucht einen Konstruktor Parameter zu initiieren. Leider funktioniert es nicht:
In der Doku habe ich "Gewusst wie: Schreiben eines Kopierkonstruktors (C#-Programmierhandbuch)" gefunden. (Suchbegriff: Konstruktoren [C#] und dann auf den Link)
Eigentlich habe ich das gleiche versucht wie in der Doku gemacht wurde! Beim debuggen wird aber folgender Fehler ausgegeben (an der Stelle wo ich den Kopierkonstruktor aufrufe):
| Zitat: |
| Es konnte keine Instanz der abstrakten Klasse oder Schnittstelle "MyClass" erstellt werden. |
Die Doku zu der Hilfe hat mir leider nicht weitergeholfen. Was bedeutet der Fehler?
EDIT: Sorry doofer Fehler! Ich habe den Kopierkonstruktor in die Unterklasse geschrieben und die Oberklasse aufgerufen...
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!