C# неизменяемый 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 неизменяемы в C#. Означает ли это, что когда у нас есть int и позже мы изменим его, мы получим новый int "указанный" той же переменной? То же самое, но со стеком.

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 неизменен?

3 ответов


вы не изменились (и не может изменить) что - то о int; вы назначили новая значение int (и отбрасывается старое значение). Таким образом, она неизменна.

рассмотрим более сложную структуру:

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

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

однако здесь нет "указания". Структура находится непосредственно в стеке (в данном случае): никаких ссылок.


чтобы следить за ответом марка (вполне приемлемым): Integer значения неизменяемы, но целочисленны переменные могут различаться. вот почему они называются "переменными".

целое значения неизменяемы: если у вас есть значение, которое является числом 12, нет способа сделать его нечетным, нет способа нарисовать его синим и так далее. Если вы попытаетесь сделать его нечетным, скажем, добавив один, тогда вы получите другое значение, 13. Может быть, вы храните это значение в переменной, которая раньше содержала 12, но это не меняет никакого свойства 12. 12 остается точно таким же, как и раньше.


хотя это может показаться очевидным, я добавлю пару строк, которые помогли мне понять, если у кого-то такая же путаница.

здесь различные виды изменчивости но обычно, когда люди говорят "неизменяемый", они имеют в виду, что у класса есть члены, которые нельзя изменить.

строка, вероятно, хранит символы в массиве, который недоступен и не может быть изменен с помощью методов, поэтому строка неизменяема. Операция + на строках всегда возвращает новую строку.

int, вероятно, хранит его значение в члене "Value", который в любом случае недоступен, и поэтому его нельзя изменить. Все операции над int возвращают новый int, и это значение копируется в переменную, потому что это тип значения.