Wenn alle Arrays nach MSDN Referenztyp sind, warum in dem angegebenen Beispielcode der neue Wert von t2
nicht die Änderung in t1
widerspiegelt?
Arrays sind Mechanismen, die es Ihnen ermöglichen, mehrere Objekte als Objekte zu behandeln einzelne Sammlung. Die Microsoft® .NET Common Language Runtime (CLR) unterstützt eindimensionale Arrays, multidimensionale Arrays und gezackte Arrays (Arrays von Arrays). Alle Array-Typen sind implizit abgeleitet von System.Array, das selbst von System.Object abgeleitet ist. Dies bedeutet, dass alle Arrays immer Referenztypen sind auf dem verwalteten Heap zugewiesen und die Variable Ihrer App enthält a Referenz auf das Array und nicht das Array selbst.
Ein Bild sagt mehr als tausend Worte, also hier ist was los:
Die Zuordnung von "Three"
zu t2
hat den Effekt, dass vor der Zuweisung t1
und t2
auf dasselbe Objekt referenziert werden, aber nach der Zuweisung auf verschiedene Objekte verweisen. Nichts anderes geht hier weiter.
Die Situation wäre anders gewesen, wenn Sie ein Array von veränderbaren -Objekten hätten und deren Wert manipuliert hätten, anstatt ihre Referenzen zu setzen. Stellen Sie sich zum Beispiel vor, das String-Array durch ein Array von StringBuilder
-Objekten zu ersetzen und t2.Replace("Two", "Three")
anstelle der Zuweisung aufzurufen. Jetzt wäre der Effekt anders, weil t1
, t2
und data[0]
auf dasselbe Objekt zeigen würden.
Strings sind auch Referenztypen. Also wenn du schreibst:
%Vor% Sie haben eine neue Variable t1
deklariert, die auf dieselbe Zeichenfolge wie data[0]
verweist. Danach schreibst du:
Jetzt haben Sie eine neue Variable t2
, die auf die gleiche Zeichenfolge wie t1
verweist. Sie haben nun ein String
-Objekt auf dem Heap und drei Referenzen auf dieses Objekt: data[0]
, t1
und t2
.
Dann schreibst du:
%Vor% Nach dieser Anweisung zeigt t2
auf eine andere Zeichenfolge im Heap mit dem Wert "Three"
. % Co_de% und data[0]
verweisen jedoch immer noch auf die ursprüngliche Zeichenfolge.
Ihre Frage hat nichts mit Arrays zu tun. Da Ihr data[0]
string
ist - und es sich um einen Referenztyp handelt - ist der Wert One
, Sie ändern den Wert nie. Sie haben gerade einen anderen String-Verweis mit dem Namen t2
erstellt und setzen den Punkt auf dasselbe Objekt mit t1
reference. Nachdem Sie dieses Referenzobjekt in "Three"
geändert haben, wirkt sich dies nicht auf den Wert von t1
aus.
Schauen wir uns Zeile für Zeile Ihren Code an;
%Vor% Mit dieser Zeile haben Sie einen String-Verweis als t1
erstellt und dieser verweist auf "One"
object.
Mit dieser Zeile erstellen Sie eine neue String-Referenz als t2
und diese verweist auf dasselbe Objekt mit t1
, was "One"
Mit dieser Zeile erstellen Sie ein String-Objekt namens "Three"
und Ihr t2
verweist auf dieses Objekt. Es zeigt nicht auf "One"
object mehr . Aber dies wirkt nicht auf t1
reference. It noch zeigt auf "One"
object.
Deshalb
%Vor%druckt
%Vor% Das Schreiben von t2 = "Three"
wird den Wert von t1 nicht ändern, da die Typen Referenztypen sind, sodass sie auf ihre Daten "zeigen". Indem Sie t2
zuweisen, sagen Sie ihm, dass er auf etwas anderes verweisen soll.
Liuwise, wenn du t2 = t1
geschrieben hast, sagst du t2
nur, dass es sich auf t1
bezieht. Zukünftige Zuweisungen an t2
werden nur dazu führen, dass es auf etwas anderes verweist.
Einige Sprachen, wie C ++, haben die Möglichkeit, einen Verweis auf andere Variablen zu speichern, so dass Sie beim Ändern des Verweises tatsächlich ändern, was die andere Variable ist.
%Vor%Wenn Sie eine Array-Referenzvariable einem anderen zuweisen, sind Sie beide Variablen beziehen sich einfach auf das gleiche Array. Du bist weder wodurch eine Kopie des Arrays erstellt wird, noch verursachen Sie die Inhalt eines Arrays, das auf den anderen kopiert werden soll.
// Array-Referenzvariablen zuweisen.
%Vor%o / p