Ответ
Первый элемент массива хранится внутри самого объекта массива в управляемой куче (Managed Heap). Массив в .NET — это единый непрерывный блок памяти.
Как это устроено:
- При создании массива
new int[10]в куче выделяется один объект, который содержит:- Заголовок объекта (указатель на тип, sync block index).
- Длину массива.
- Непосредственно все элементы, расположенные друг за другом.
- Переменная массива в стеке хранит лишь ссылку на этот блок в куче.
- Сборщик мусора (GC) работает с массивом как с цельным объектом. Он не отслеживает ссылки на отдельные элементы.
Пример и важное следствие:
class Item { }
Item[] items = new Item[100];
items[0] = new Item(); // Созданный Item хранится ВНУТРИ массива `items`.
// Если ссылка `items` станет недостижимой,
// ВЕСЬ массив, включая все 100 элементов (ссылок), будет помечен для сборки.
Почему так? Это обеспечивает высокую производительность при итерации (элементы лежат в памяти последовательно — принцип локальности) и упрощает работу GC.