Вот что меня смущает: в .NET тип string
— это класс, но его поведение выглядит так, как будто это тип значения!
Так является ли string
типом значения (память стека) или ссылочным типом (память кучи)?
Вот что меня смущает: в .NET тип string
— это класс, но его поведение выглядит так, как будто это тип значения!
Так является ли string
типом значения (память стека) или ссылочным типом (память кучи)?
System.String
является ссылочным типом. Поведение, подобное значению, на самом деле является тем, что называется неизменностью, означающей, что объект, однажды созданный, не может быть изменен. Все операции, которые вы ожидаете изменить объект (например, .ToUpper()
), вместо этого создают новый экземпляр.
Изменчивость — это отдельная тема от того, является ли что-то ссылочным типом или типом значения. У вас могут быть изменяемые типы значений (хотя они считаются плохой идеей™).
На вопрос о распределении простой ответ заключается в том, что ссылочные типы обычно размещаются в куче, а типы значений обычно размещаются в стеке.
В Правда о типах значений, Эрик Липперт объясняет, как среда CLR принимает решения о распределении, основываясь больше на времени жизни, чем на чем-либо другом. Как правило, это детали, о которых вам не нужно беспокоиться, но в любом случае это интересная информация.
int[]
в стек? Помещается ли int вclass C { int x; }
в стек? Конечно нет. Просто выкиньте из головы эту бредовую идею, потому что в ней нет никакого смысла. Переменные, время жизни которых известно как короткое, помещаются в стек. - person Eric Lippert   schedule 28.02.2014