Array in C # sind Referenztypen, weshalb sie als Werttypen fungieren?

7

Wenn alle Arrays nach MSDN Referenztyp sind, warum in dem angegebenen Beispielcode der neue Wert von t2 nicht die Änderung in t1 widerspiegelt?

%Vor%

Ссылка

  

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.

    
nunu 13.03.2015, 12:26
quelle

6 Antworten

19

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.

    
dasblinkenlight 13.03.2015, 12:39
quelle
7

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:

%Vor%

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.

    
Elian Ebbing 13.03.2015 12:32
quelle
7

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.

%Vor%

Mit dieser Zeile erstellen Sie eine neue String-Referenz als t2 und diese verweist auf dasselbe Objekt mit t1 , was "One"

ist %Vor%

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%     
Soner Gönül 13.03.2015 12:29
quelle
0

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.

    
Sean 13.03.2015 12:31
quelle
0

Dieses Programm verhält sich genau wie erwartet.

%Vor%     
sm.abdullah 13.03.2015 12:39
quelle
-1
  

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

%Vor%     
user7011379 18.02.2017 04:22
quelle

Tags und Links