С# неизменяемый int
В Java строки неизменяемы. Если у нас есть строка и внести в нее изменения, мы получим новую строку, на которую ссылается одна и та же переменная:
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
Было сказано, что int и double неизменны в С#. Означает ли это, что, когда у нас есть int, а затем изменит его, мы получим новую int "point" той же переменной? То же самое, но со стеком.
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
Это правильно? Если нет, то каким образом int неизменен?
Ответы
Ответ 1
Вы не изменили (и не можете изменить) что-то о int; вы присвоили значение new int (и отбросили старое значение). Таким образом, он неизменен.
Рассмотрим более сложную структуру:
var x = new FooStruct(123);
x.Value = 456; // mutate
x.SomeMethodThatChangedInternalState(); // mutate
x = new FooStruct(456); // **not** a mutate; this is a *reassignment*
Однако здесь нет "указаний". Строка находится непосредственно в стеке (в данном случае): ссылки не связаны.
Ответ 2
Чтобы следить за Marc (вполне приемлемым) ответом: Целочисленные значения неизменяемы, но целочисленные переменные могут различаться. Вот почему они называются "переменными".
Целочисленные значения неизменяемы: если у вас есть значение, которое является номером 12, нет никакого способа сделать его нечетным, никоим образом не нарисовать его синим и так далее. Если вы попытаетесь сделать это странным, скажем, добавив одно, тогда вы получите другое значение 13. Возможно, вы сохраните это значение в переменной, которая содержала 12, но это не изменяет никакого свойства 12. 12 остается таким же, как и раньше.
Ответ 3
Хотя это может показаться очевидным, я добавлю пару строк, которые помогли мне понять, если у кого-то будет такая же путаница.
Есть различные виды изменчивости, но обычно, когда люди говорят "неизменными", они подразумевают, что у класса есть члены, которые не могут быть изменены.
Строка, вероятно, хранит символы в массиве, который недоступен и не может быть изменен с помощью методов, поэтому строка является неизменной. Операция + по строкам всегда возвращает новую строку.
int, вероятно, сохраняет значение в члене "Значение", которое в любом случае недоступно, и почему его нельзя изменить. Все операции над int возвращают новый int, и это значение копируется в переменную, потому что это тип значения.