Прочтите: Стек - это деталь реализации , и никогда больше не повторяйте утку о том, что распределение стека - это то, что отличает значение типы из ссылочных типов в .NET. CLR может выбрать размещение переменной где угодно.
Наиболее важное различие заключается в семантике присваивания. Когда вы присваиваете тип значения переменной (или передаете его методу в качестве аргумента), все данные копируются. Когда вы назначаете ссылочный тип, копируется только ссылка - обе ссылки указывают на один и тот же экземпляр объекта в памяти.
Как упоминалось в блоге Аарона и Эрика:
Помните правило, ссылочные типы всегда отправляются в кучу, тогда как типы значений всегда отправляются туда, где они были объявлены? Если тип значения объявлен вне метода, но внутри ссылочного типа, он будет помещен в кучу внутри ссылочного типа.