Autor Beitrag
Max064
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: Do 22.07.10 12:11 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4807
Erhaltene Danke: 1061

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Do 22.07.10 12:39 
Wie setzt du die beiden Listen gleich?
So etwa:
ausblenden 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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: 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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: Do 22.07.10 13:49 
Hallo,

es gibt die AddRange-Methode oder gleich bei der Initiierung als Konstruktor-Parameter.

Gruß
Max064 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 52



BeitragVerfasst: 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...