Об неизменяемости, о которой идет речь, являются методы структуры, а не значение самой структуры. Экземпляр структуры всегда может быть видоизменен посредством присваивания - подумайте о переменной целочисленного цикла в цикле for; он изменяется при каждом прохождении цикла.
Но для структуры System.Int32
структуры (т. Е. int
) не имеет смысла иметь метод DoubleIt
, который заставляет базовое целое число удваивать свое значение без какой-либо очевидной операции присваивания (например, как ++i;
на самом деле i=i+1;
).
Рассмотрим разницу между string.Replace
и StringBuilder.Replace
. Класс System.String
является неизменным. Метод Replace для строки возвращает новый экземпляр строки, который представляет исходную строку после операции замены. StringBuilder's Replace выполняет замену на месте, изменяя внутренний объект.
Итак, если я создаю целочисленный массив:
var ar = new int[] {1, 2, 3, 4};
Я всегда могу изменить содержимое этого массива (экземпляр System.Array, ссылочный тип) путем присвоения массива:
ar[2] = 200;
Что не имеет смысла, так это вызывать какой-либо метод мутации для этого (целочисленного) элемента массива.