С# неизменяемый 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, и это значение копируется в переменную, потому что это тип значения.