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?
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
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%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.
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%clone ist das Objekt, das Sie versuchen zu klonen.
%Vor%Sie erklären es so.
Tags und Links visual-studio vb.net