В реализации Microsoft компилятора C# и CLR типы значений хранятся в стеке, когда значение представляет собой временное значение, локальную переменную или формальный параметр, который не является ни закрытой внешней переменной анонимного метода, ни в блоке итератора.
Конечно, зачем хранить вещи в стеке, если вам это не нужно? Некоторые локальные переменные типа значения никогда не попадают в стек; они остаются в реестрах на всю жизнь.
Другие значения типов значений хранятся в типах со значениями кучи, полями ввода значений типа ссылки и т. Д.
Типы значений, конечно, могут храниться ни в стеке, ни в регистре, ни в управляемой куче; они могут храниться в неуправляемой памяти с использованием некоторого полностью другого менеджера памяти, не находящегося под управлением CLR.
(И, конечно, отметить, что с помощью «» в «стопке» тонко вводит в заблуждение,. Может быть много стеков в процессе Там не должно быть только один.)
Все это деталь реализации и могут быть изменены без предварительного уведомления.
Кроме того, очевидно, что вещи, выделенные объявлением распределения стека, выделяются в стеке.
Для получения дополнительной информации по этой теме см мои статьи на нем:
http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail.aspx
http://blogs.msdn.com/b/ericlippert/archive/2009/05/04/the-stack-is-an-implementation-detail-part-two.aspx
Почему вы заботитесь? Время выполнения управляет всеми этими деталями для вас, так что вам не нужно беспокоиться об этом. Вам просто интересно, или это приводит к еще большему вопросу?
Введите «куча стека C#» в поле поиска выше, и вы быстро найдете нужную вам информацию. –