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