Где хранятся типы значений, определенные в ссылочном типе (куча или стек)? - PullRequest
4 голосов
/ 10 июня 2010

Типы значений, определенные внутри ссылочного типа, хранятся в куче или в стеке?

  1. Если хранится в куче, то когда типы значений хранятся в стеке?
  2. Если хранится в стеке, что происходит внутри кучи, поскольку в конце все заканчивается типом значения?

Ответы [ 3 ]

3 голосов
/ 10 июня 2010

Единственные переменные, хранящиеся в стеке, являются локальными переменными для функции. Для ссылочных типов ссылка хранится в стеке, а объект, на который она ссылается, хранится в куче. Для типов значений сам объект хранится в стеке. Обратите внимание, что локальные переменные, которые могут выходить из локальной функции (например, через замыкание), хранятся в отдельной структуре данных в куче, включая любые типы значений, которые могут быть включены.

Другими словами, поскольку ссылочные типы всегда хранятся в куче, все, что они содержат (даже типы значений), также сохраняется в куче.

2 голосов
/ 10 июня 2010
1 голос
/ 10 июня 2010

Как указано здесь :

Каждая локальная переменная (т.е. одна объявленная в методе) хранится в стеке. Это включает в себя переменные ссылочного типа - сама переменная находится в стеке, но помните, что значение Переменная ссылочного типа является только ссылка (или ноль), а не объект сам. Параметры метода считаются как локальные переменные тоже, но если они объявлены с модификатором ref, они не получить свой собственный слот, но поделиться слот с переменной, используемой в телефонный код

Полагаю, что-то вроде TextBox txtbx = new TextBox(); означает, что переменная txtbx находится в стеке, но ее значение обычно является ссылкой на объект, находящийся в куче.

Переменные экземпляра для ссылочного типа всегда находятся в куче. Вот где сам объект «живет».

...