Операторы ++
и --
реализованы в терминах обычных операторов +
и -
, поэтому в действительности:
b++;
эквивалентно:
var temp = b;
b = b + 1;
<use temp for the expression where b++ was located>
Теперь, как прокомментировано, может показаться, что это нарушает неизменность, но это не так.
Вместо этого вы должны смотреть на этот код следующим образом:
var temp = b;
b = BigInteger.op_Add(b, 1); // constructs a new BigInteger value
<use temp ...>
Это оставит в памяти два объекта: исходное значение BigInteger и новый, на который теперь ссылается b. Вы можете легко проверить, что именно так происходит с помощью следующего кода:
var x = b;
b++;
// now inspect the contents of x and b, and you'll notice that they differ
Таким образом, исходный объект не изменился, следовательно, он не нарушает неизменность, и, чтобы ответить на новую часть вопроса, это должно быть поточно-ориентированным.
То же самое происходит со строками:
String s1 = s2;
s2 += "More";
// now inspect s1 and s2, they will differ