2012-12-23 4 views
15

In Java sind Strings unveränderlich. Wenn wir einen String und Änderungen daran vornehmen müssen, erhalten wir neue Zeichenfolge mit dem gleichen Variable verwiesen:C# unveränderlich int

String str = "abc"; 
str += "def"; // now str refers to another piece in the heap containing "abcdef" 
       // while "abc" is still somewhere in the heap until taken by GC 

It's been said, die int und double sind in C# unveränderlich. Bedeutet es, dass wir, wenn wir int haben und es später ändern, einen neuen int durch die gleiche Variable "zeigen" würden? Die gleiche Sache, aber mit Stapel.

int i = 1; 
i += 1; // same thing: in the stack there is value 2 to which variable 
     // i is attached, and somewhere in the stack there is value 1 

Ist das korrekt? Wenn nicht, auf welche Weise ist int unveränderlich?

+8

Der Vollständigkeit halber sind .NET-Zeichenfolgen ebenfalls unveränderbar. –

Antwort

16

Sie haben nicht geändert (und kann nicht ändern) etwas über die Int; Sie haben einen neuen int-Wert zugewiesen (und den alten Wert verworfen). So ist es unveränderlich.

Betrachten wir eine komplexere Struktur:

var x = new FooStruct(123); 
x.Value = 456; // mutate 
x.SomeMethodThatChangedInternalState(); // mutate 

x = new FooStruct(456); // **not** a mutate; this is a *reassignment* 

Allerdings gibt es hier keine "zeigt". Die Struktur befindet sich direkt auf dem Stack (in diesem Fall): keine Referenzen involviert. Integer Werte sind unveränderlich, aber integer Variablen variieren kann:

+0

Danke, jetzt habe ich es! –

21

Um oben auf Marcs (durchaus akzeptabel) Antwort zu folgen. Deshalb werden sie "Variablen" genannt.

Integer Werte sind unveränderlich: Wenn Sie den Wert haben, der die Zahl 12 ist, gibt es keine Möglichkeit, es seltsam zu machen, keine Möglichkeit, es blau zu malen, und so weiter. Wenn Sie versuchen, es ungerade zu machen, indem Sie beispielsweise eins hinzufügen, erhalten Sie einen anderen Wert, 13. Vielleicht speichern Sie diesen Wert in der Variablen, die früher 12 enthielt, aber das ändert keine Eigenschaft von 12. 12 bleibt genau so wie zuvor.

2

Obwohl dies vielleicht offensichtlich klingt, werde ich ein paar Zeilen hinzufügen, die mir geholfen haben zu verstehen, falls jemand die gleiche Verwirrung hat.

Es gibt various kinds of mutability aber allgemein, wenn Leute "unveränderlich" sagen, meinen sie, dass Klasse Mitglieder hat, die nicht geändert werden können.

String speichert wahrscheinlich Zeichen in einem Array, das nicht zugänglich ist und nicht über Methoden geändert werden kann, deshalb ist String unveränderlich. Operation + für Strings gibt immer eine neue Zeichenfolge zurück.

int speichert wahrscheinlich seinen Wert im Member "Value", auf den sowieso nicht zugegriffen werden kann und deshalb nicht geändert werden kann. Alle Operationen von int geben ein neues int zurück, und dieser Wert wird in die Variable kopiert, weil es ein Werttyp ist.