В C # почему String является ссылочным типом, который ведет себя как тип значения? - PullRequest
331 голосов
/ 12 марта 2009

String является ссылочным типом, даже если он имеет большинство характеристик типа значения, например неизменяемость и перегруженность == для сравнения текста, а не уверенность, что они ссылаются на один и тот же объект.

Почему тогда строка не является просто типом значения?

Ответы [ 12 ]

1 голос
/ 23 июня 2012

Не так просто, как строки состоят из массивов символов. Я смотрю на строки как на символьные массивы []. Поэтому они находятся в куче, поскольку эталонная ячейка памяти хранится в стеке и указывает на начало ячейки памяти массива в куче. Размер строки неизвестен до ее выделения ... идеально подходит для кучи.

Именно поэтому строка действительно неизменна, потому что, когда вы изменяете ее, даже если она того же размера, компилятор не знает об этом и должен выделить новый массив и назначить символы позициям в массиве. Это имеет смысл, если вы думаете о строках как о способе, которым языки защищают вас от необходимости выделять память на лету (читайте C, как программирование)

0 голосов
/ 08 марта 2016

Риск получить еще одно загадочное отрицательное голосование ... тот факт, что многие упоминают стек и память относительно типов значений и примитивных типов, заключается в том, что они должны вписываться в регистр в микропроцессоре. Вы не можете вытолкнуть или вытолкнуть что-либо в / из стека, если для этого требуется больше битов, чем в регистре… инструкции, например, «pop eax» - потому что eax имеет ширину 32 бита в 32-битной системе.

Типы примитивов с плавающей точкой обрабатываются FPU, ширина которого составляет 80 бит.

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

...