Erstellen Sie einen "Klon" dieses Objekts, zeigen Sie nicht darauf

8

Sagen wir, ich habe eine Liste namens

%Vor%

Und dann möchte ich eine Kopie dieser Liste erstellen, damit ich selbst einige Verbesserungen vornehmen kann. Also mache ich das:

%Vor%

Aber ich habe bemerkt, dass die Änderungen auch das myFirstList -Objekt betreffen! Ich möchte nur, dass die Tweaks das zweite beeinflussen ...

Und danach möchte ich mySecondList komplett löschen, also mache ich mySecondList = Nothing und mir geht es gut, oder?

    
Voldemort 06.04.2011, 23:07
quelle

7 Antworten

6
  

Aber ich habe bemerkt, dass die Tweaks auch   Beeinflussen Sie das myFirstList-Objekt! ich nur   wollen die Tweaks auf die Sekunde auswirken   eins ...

Natürlich tut es das. Beide Variablen zeigen auf das selbe Objekt im Speicher. Alles, was du dem einen antust, passiert dem anderen.

Abhängig von Ihren Anforderungen müssen Sie entweder einen tiefen oder einen oberflächlichen Klon erstellen. Dieser Artikel sollte Ihnen eine bessere Vorstellung davon geben, was Sie tun müssen

    
Adam Rackis 06.04.2011, 23:10
quelle
5

Da Sie den Typ des Elements, das Sie in Ihrer Liste speichern, nicht preisgegeben haben, gehe ich davon aus, dass es IClonable implementiert (andernfalls können Sie IClonable implementieren oder eine Möglichkeit finden, einzelne Elemente in der Liste zu klonen). .

Versuche so etwas

%Vor%     
Bala R 06.04.2011 23:12
quelle
4

Adam Rackis, ich mag dein "Natürlich tut es nicht", weil es überhaupt nicht offensichtlich ist.

Wenn Sie eine Zeichenfolgenvariable haben, die Sie einer anderen Zeichenfolgenvariable zuweisen, ändern Sie diese nicht, wenn Sie an einer davon Änderungen vornehmen. Sie zeigen nicht auf das gleiche physische Gedächtnisstück, also warum ist es offensichtlich, dass Klassen tun?

Auch das Ding ist nicht einmal konsistent. Im folgenden Fall haben Sie alle Elemente im Array auf dasselbe Objekt gerichtet (sie haben alle die Variable Number auf 10 gesetzt:

) %Vor%

ABER, das folgende gibt Ihnen 10 verschiedene Instanzen:

%Vor%

Offensichtlich macht der Umfang des Objekts einen Unterschied, so dass es nicht offensichtlich ist, was passiert.

    
FrankB 28.10.2015 23:38
quelle
3

So machen Sie es:

%Vor%     
deuan 26.02.2016 01:04
quelle
2

Erweitern auf Adam Rackies 'Antwort Ich konnte den folgenden Code mit VB.NET implementieren.

Mein Ziel war es, eine Liste von Objekten zu kopieren, die hauptsächlich als Datenübertragungsobjekte (dh Datenbankdaten) dienten. Zuerst wird die Klasse dtoNamedClass definiert und ShallowCopy -Methode wurde hinzugefügt. Eine neue Variable mit dem Namen dtoNamedClassCloneVar wird erstellt, und eine LINQ-Select-Abfrage wird zum Kopieren der Objektvariablen dtoNamedClassVar verwendet.

Ich konnte Änderungen an dtoNamedClassCloneVar vornehmen, ohne dtoNamedClassVar zu beeinflussen.

%Vor%     
wavedrop 27.02.2013 15:38
quelle
1

das funktioniert für mich:

%Vor%     
myQwil 28.06.2013 14:17
quelle
0

clone ist das Objekt, das Sie versuchen zu klonen.

%Vor%

Sie erklären es so.

    
user8005205 12.05.2017 22:36
quelle

Tags und Links