[C# 2.0] Probleme mit der Clone-Funktion

lukasS

Erfahrenes Mitglied
Hallo,

ich habe ein Problem mit der Copy-Funktion. Die Instanz referenziert sich, trotz der Clone-Funktion.

Ich habe zwei einfache Klassen (c und c1) erstellt. Die eine (c1) hat eine Property vom Typ bool. Die andere Klasse(c) hat ein Array vom Typ c1. (Bsp. siehe unten)
Beide Klasse besitzen eine Clone-Funktion.
Problem ist jetzt, dass das Array im Hauptprogramm nicht kopiert, sondern referenziert wird. So blad ich einen Wert in der Quell-Klasse ändere, ändert sich auch der Wert der neuen Klasse.

Hat vielleicht jemand eine Idee, was ich sonst nach versuchen könnte?

Danke schonmal!

Lukas

Klassen:
Code:
//Klasse 1
      class c
      {
         private c1[] arrTest;
         public c1[] arr
         {
            get { return arrTest; }
            set { arrTest = value; }
         }

         public c()
         {
            arrTest = new c1[5];
            for (int i = 0; i < arrTest.Length; i++)
               arrTest[i] = new c1();
         }//c

         public virtual c Clone()
         {
            c tmpThis = (c)MemberwiseClone();

            //schon erfolglos getestet
            //tmpThis.arrTest = (c1[])arrTest.Clone();
            //Array.Copy(arrTest, tmpThis.arrTest, arrTest.Length);

            for (int i = 0; i < arrTest.Length; i++)
               tmpThis.arrTest[i] = this.arrTest[i].Clone();

            return tmpThis;
         }//Clone

      }//class c

//Klasse 2
      class c1
      {
         private bool bTest;
         public bool Test
         {
            get { return bTest; }
            set { bTest = value; }
         }

         public virtual c1 Clone()
         {
            return (c1)this.MemberwiseClone();
         }//Clone

      }//class c1





///////////////////////////////////////

         c org = new c();
         c bkp = org.Clone();

         org.arr[0].Test = true;
//bkp.arr[0] ist jetzt auch true;

/////////////////////////////////////////
 
Nach 4 Std habe cih die Lösung, es fehlt noch das

Code:
tmpThis.arrTest = (c1[])arrTest.Clone();

und dazu das Array mit Clone.

Gruß

Lukas
 
Problem ist das MemberwiseClone bei referenz typen nur die Referenz übergibt und das Objekt sozusagen nicht neu erstellt wird.

Deswegen wie du es gemacht hast die integrierte Clone Methode verwenden, wenn vorhanden. Oder die Objekte neu instanziieren.
 
Problem ist das MemberwiseClone bei referenz typen nur die Referenz übergibt und das Objekt sozusagen nicht neu erstellt wird.

Deswegen wie du es gemacht hast die integrierte Clone Methode verwenden, wenn vorhanden. Oder die Objekte neu instanziieren.

Also wenn ich aber mit "tmpThis.arrTest" irgendeine Änderung vornehme (neu instanzieren/initialisieren), wirkt sich das auch auf die andere Instanz "this.arrTest" des Arrays.

Wie dem auch sei, das funktioniert jetzt :)

Gruß

Lukas
 
Hi

Du kannst das ganze auch einfacher machen:

Serialisier das Objekt (Binär oder Xml) deserialisier es anschließend wieder. So kannst auch nichts vergessen.
 
Hi

Du kannst das ganze auch einfacher machen:

Serialisier das Objekt (Binär oder Xml) deserialisier es anschließend wieder. So kannst auch nichts vergessen.

Ist das nicht langsamer also das Clone? Es wird ja eine Datei geschrieben oder merkt man das nicht? Stelle mir nur gerade vor, wenn die Klassen noch z. B. Bilder beinhalten, das müsste man doch beim Serialisieren merken.

Gruß

Lukas
 
Ich hab ja nicht gesagt, dass du das in eine Datei schreiben sollst.
Du sollst dass ja wenn nur im Speicher machen!

Und langsamer ist das nicht. Auf jeden Fall aber sicherer.
 

Neue Beiträge

Zurück