Недавно узнал, что в языке C#, помимо разнообразия самих типов, их ещё делят на "подкатегории", а именно ссылочные типы и значимые типы. Интересно бы узнать, какие типы относятся к каждой из категорий, зачем вообще нужна эта делёжка, и в чём конкретно заключается различие между этими "подкатегориями"?
"Делёжка" нужна для того что б отделить значимые типы, хранящиелся в стеке памяти от ссылочных типов, которые находятся в куче.
Стек (stack) - "упорядоченая" область памяти, где значения хранятся как-бы "одно поверх другое".
Куча (heap) - "хаотичная" область памяти, которую можно представить как неоднородную массу из кучи значений. Эти значения привязаны ссылками к элементам в стеке. По мере удаления элементов в стеке, связь между "стековыми" и "хиповыми" элементами теряется, и сборщик мусора удаляет все непривязанные ни к чему элементы в куче и очищает память.
Ссылочные типы:
- тип Object;
- String;
- все классы;
- интерфейсы;
- делегаты.
Значимые типы:
- все "примитивные" типы (int, long, byte, short, uint и тд);
- типы с плавабщей точкой (double, float);
- decimal;
- bool;
- структуры (struct);
- перечисления (enum).