Пространство стека используется для передачи аргументов методу и для локальных переменных определено в методе. Локальные переменные ссылочного типа будут храниться в куче, а указатель на эти объекты будет храниться в стеке. Но локальные переменные типа значения будут храниться в стеке.
Кстати, пространство стека принадлежит потокам. Размер стека по умолчанию составляет 1 МБ. Каждый поток получает стек, в то время как для приложения обычно есть только одна куча.
И объекты хранятся в куче вместе со всеми их полями и свойствами.
Теперь давайте go line по линии.
static int a = 1;
Поля Stati c будут храниться в куче вместе с объектом Type
. Потому что поля stati c на самом деле относятся к объекту Type
, который будет автоматически создан CLR при первом доступе к экземпляру этого Type
или непосредственно к Type
. Этот Type
объект содержит всю информацию, относящуюся к типу.
Тогда:
Employee E1 = new Employee();
Employee E2 = new Employee();
У вас есть два Employee
объекта в куче. И адреса этих объектов в стеке (E1
и E2
). Но если Employee
был структурой, то E1
и E2
будут храниться в стеке вместе со всей информацией. Если в этой структуре есть какое-то поле ссылочного типа, то данные этого поля будут храниться в куче, а адрес этого поля будет храниться в стеке внутри Employee
.