Какие есть ссылочные (reference) и значимые (value) типы, в чём их разница?

Недавно узнал, что в языке C#, помимо разнообразия самих типов, их ещё делят на "подкатегории", а именно ссылочные типы и значимые типы. Интересно бы узнать, какие типы относятся к каждой из категорий, зачем вообще нужна эта делёжка, и в чём конкретно заключается различие между этими "подкатегориями"?

"Делёжка" нужна для того что б отделить значимые типы, хранящиелся в стеке памяти от ссылочных типов, которые находятся в куче.

Стек (stack) - "упорядоченая" область памяти, где значения хранятся как-бы "одно поверх другое".

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


Ссылочные типы:

- тип Object;

- String;

- все классы;

- интерфейсы;

- делегаты.


Значимые типы:

- все "примитивные" типы (int, long, byte, short, uint и тд);

- типы с плавабщей точкой (double, float);

- decimal;

- bool;

- структуры (struct);

- перечисления (enum).