Да и нет.
Ответ - да в том смысле, что это:
i++;
эквивалентно этому:
i = i + 1;
, что было бы эквивалентно этому (если бы System.Int32
имел конструктор с этой подписью):
i = new int(i + 1);
НО ...
Конструктор для типа значения в .NET не является никоим образом таким же, как конструктор ссылочного типа.
Пространство для типа значения выделяется один раз в стеке. Когда вы пишете i = i + 1
, это просто записывает новое значение в то же место в памяти. Это не новое выделение в куче.
На самом деле это деталь реализации; но это не меняет того факта, что ответ на то, что, на мой взгляд, вы действительно спрашиваете: «Требуется ли для записи i++
выделение некоторой новой памяти где-нибудь? - ответ на , что вопрос - нет.
Итак, проясним несколько моментов:
Всегда ли приращение создает новые экземпляры и отбрасывает старые?
Нет - это демонстрирует неправильное понимание того, как работают типы значений. Имеет смысл только сказать, что увеличение значения «отбрасывает старое», если типы значений размещаются в некотором пространстве, отличном от локального стека. Это правда, что старое значение перезаписано , но вряд ли вы найдете это удивительным.
Кстати, инкрементный поток безопасен? В документации говорится, что все члены Int32 являются поточно-ориентированными. , .
Если в документации сказано, что все элементы Int32
являются поточно-ориентированными, это означает, что это относится к текущему значению. Фактически, любой неизменяемый тип будет поточно-ориентированным, потому что, если он не может быть изменен, он не может быть поврежден.
Вы должны понимать, что i++
- это не просто вызов метода для некоторого значения i
; это присвоение из i
новому значению. Эта операция - присвоение i
новому увеличенному значению - не поточно-безопасна в том смысле, что два потока могут одновременно выполнять этот код одновременно, и вы можете получить новое значение i
это только на 1 больше, чем предыдущее значение. Вот для чего Interlocked.Increment
. Но документация MSDN не обманывает вас; внутреннее состояние i
не может быть скомпрометировано многопоточным доступом.