Тип строки хранится в куче или в стеке?

Вот что меня смущает: в .NET тип string — это класс, но его поведение выглядит так, как будто это тип значения!

Так является ли string типом значения (память стека) или ссылочным типом (память кучи)?


person Ziad Salem    schedule 28.02.2014    source источник
comment
Куча с указателем на стек или как часть другого набора элементов кучи, это ссылочный тип.   -  person Adam Houldsworth    schedule 28.02.2014
comment
То, что сказал @AdamHouldsworth, плюс пул строк.   -  person Redwan    schedule 28.02.2014
comment
Избегайте путаницы Ссылочные типы помещаются в кучу, а типы значений — в стек(не всегда).   -  person Sriram Sakthivel    schedule 28.02.2014
comment
и что вы подразумеваете под но его поведение похоже на значение ? Можете ли вы объяснить некоторые из них?   -  person Sriram Sakthivel    schedule 28.02.2014
comment
я имел в виду ‹b›, но его поведение выглядит как значение ‹\b›, если у нас есть 2 строковые переменные? строка s1=коко,s2; с2=с1; здесь s2 будет иметь значение s1, а не адрес памяти   -  person Ziad Salem    schedule 28.02.2014
comment
Нет, вы ошибаетесь.   -  person Sriram Sakthivel    schedule 28.02.2014
comment
возможный дубликат Почему строки ведут себя как ValueType   -  person Hans Passant    schedule 28.02.2014
comment
Это ссылочный тип, который во многих отношениях ведет себя как тип значения.   -  person paparazzo    schedule 28.02.2014
comment
Вы, видимо, верите в миф о том, что типы значений помещаются в стек. Это просто неверно. Попадают ли целые числа в int[] в стек? Помещается ли int в class C { int x; } в стек? Конечно нет. Просто выкиньте из головы эту бредовую идею, потому что в ней нет никакого смысла. Переменные, время жизни которых известно как короткое, помещаются в стек.   -  person Eric Lippert    schedule 28.02.2014


Ответы (1)


System.String является ссылочным типом. Поведение, подобное значению, на самом деле является тем, что называется неизменностью, означающей, что объект, однажды созданный, не может быть изменен. Все операции, которые вы ожидаете изменить объект (например, .ToUpper()), вместо этого создают новый экземпляр.

Изменчивость — это отдельная тема от того, является ли что-то ссылочным типом или типом значения. У вас могут быть изменяемые типы значений (хотя они считаются плохой идеей™).


На вопрос о распределении простой ответ заключается в том, что ссылочные типы обычно размещаются в куче, а типы значений обычно размещаются в стеке.

В Правда о типах значений, Эрик Липперт объясняет, как среда CLR принимает решения о распределении, основываясь больше на времени жизни, чем на чем-либо другом. Как правило, это детали, о которых вам не нужно беспокоиться, но в любом случае это интересная информация.

person Paul Turner    schedule 28.02.2014
comment
ссылка больше не работает - person Oyeme; 12.04.2021
comment
@Oyeme Спасибо, что сообщили нам - я нашел его новый дом и обновил ссылку. - person Paul Turner; 13.04.2021