2 Stimmen

Frage zu Referenztypen

Dies stammt von Jon Skeets ausgezeichneter persönlicher C#-Seite ( http://www.yoda.arachsys.com/csharp/ ):

StringBuilder first = new StringBuilder();
StringBuilder second = first;
first.Append ("hello");
first = null;
Console.WriteLine (second);

1) Das Ändern des Wertes von "first" hat keine Auswirkungen auf den Wert von "second".

2) obwohl ihre Werte immer noch Verweise auf dasselbe Objekt sind, werden alle Änderungen, die über die erste Variable am Objekt vorgenommen werden, über die zweite Variable sichtbar.

Dies ist ein Auszug aus demselben Satz. Was ist mit dem Ändern des Wertes gemeint? Ich gehe davon aus, dass es sich um den Wert einer Variablen handelt (z. B. int x = 4, oder 5, oder 45 usw.).

Heißt das, wenn der erste Punkt auf ein anderes kompatibles Objekt zeigt, hat er keine Auswirkungen auf den zweiten?

Alles auf dieser Seite macht Sinn, ich denke, es ist nur ein Problem mit meiner Interpretation der englischen Sprache.

Gracias

4voto

jason Punkte 227577

first ist ein Verweis auf ein Objekt des Typs StringBuilder . Das heißt, first speichert einen Wert, der verwendet werden kann, um auf ein Objekt auf dem Heap zu verweisen, das vom Typ Stringuilder . second ist ein weiterer Verweis auf ein Objekt des Typs StringBuilder und sein Wert wird zunächst auf dasselbe Objekt gesetzt, das first bezieht sich auf.

Wenn Sie den Wert von first Was Sie tun, ist, die Bezeichnung des Referenten zu ändern. Das heißt, Sie verwenden first um auf ein anderes Objekt zu verweisen. Dies hat keine Auswirkungen auf second ; sein Wert wird nicht durch Änderungen des Wertes von first . (Zur Erinnerung: Der Wert von first y second sind Referenzen, die zunächst denselben Referenten haben. Aber genau wie bei

int x = 1;
int y = x;
x = 2;

ändert nicht den Wert von y ändern Sie den Wert von first ändert nicht den Wert von second .

Andererseits, wenn first y second auf dasselbe Objekt verweisen, werden alle Änderungen an diesem Objekt durch beide first y second .

Stellen Sie sich das so vor. Nehmen wir an, ich erstelle eine Textdatei first.html deren Inhalte sind

<a href="http://stackoverflow.com">Stack Overflow</a>

und ich gebe den Befehl copy first.html second.html . Dann können beide Seiten verwendet werden, um auf dieselbe Webseite zu verweisen; wenn wir dem Link folgen, gelangen wir zu demselben Verweis. Wenn Änderungen an der Homepage von Stack Overflow vorgenommen werden, kann der Zugriff auf die Homepage entweder über first.html o second.html wird es mir ermöglichen, diese Änderungen zu sehen. Wenn ich dann aber den Inhalt von first.html zu sein

<a href="http://www.thedailywtf.com>The Daily WTF</a>

dann kann ich nicht mehr verwenden first.html um auf die Stack Overflow-Homepage zu verweisen. Außerdem hat diese Änderung keine Auswirkungen auf den Wert von second.html . Es ist immer noch

<a href="http://stackoverflow.com>Stack Overflow</a>

Stellen Sie sich den Inhalt dieser Dateien als die Werte eines Referenztyps vor, und die endgültige Bestimmung als das Referenzobjekt.

0voto

dma Punkte 1713

Der Unterschied zwischen dem Wert des Objekts selbst und dem Inhalt des Objekts ist nicht klar.

So ist es beispielsweise möglich, den Inhalt der zweiten Datei durch den Aufruf von Methoden der ersten Datei zu ändern, wie beim Aufruf von Append im Beispiel. Wird jedoch der Wert von first auf null gesetzt, wird second nicht auf null gesetzt.

Sie können dies leicht erkennen, indem Sie diesen Code schreiben und ihn in einem Debugger durchgehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X