Где будет храниться первый элемент массива при сборке мусора?

«Где будет храниться первый элемент массива при сборке мусора?» — вопрос из категории Управление памятью, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Первый элемент массива хранится внутри самого объекта массива в управляемой куче (Managed Heap). Массив в .NET — это единый непрерывный блок памяти.

Как это устроено:

  1. При создании массива new int[10] в куче выделяется один объект, который содержит:
    • Заголовок объекта (указатель на тип, sync block index).
    • Длину массива.
    • Непосредственно все элементы, расположенные друг за другом.
  2. Переменная массива в стеке хранит лишь ссылку на этот блок в куче.
  3. Сборщик мусора (GC) работает с массивом как с цельным объектом. Он не отслеживает ссылки на отдельные элементы.

Пример и важное следствие:

class Item { }
Item[] items = new Item[100];
items[0] = new Item(); // Созданный Item хранится ВНУТРИ массива `items`.
// Если ссылка `items` станет недостижимой, 
// ВЕСЬ массив, включая все 100 элементов (ссылок), будет помечен для сборки.

Почему так? Это обеспечивает высокую производительность при итерации (элементы лежат в памяти последовательно — принцип локальности) и упрощает работу GC.