Как реализован массив в C#?

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

Ответ

В C# массив — это объект типа System.Array, хранящий элементы одного типа в непрерывном блоке памяти управляемой кучи (heap). Даже массивы типов-значений (value types) являются ссылочными объектами.

Ключевые особенности реализации:

  • Фиксированный размер: Количество элементов задаётся при создании и не может быть изменено.
  • Индексация с нуля: Доступ к элементам осуществляется по целочисленному индексу, начиная с 0.
  • Контроль границ: При каждом обращении по индексу выполняется проверка выхода за границы массива (Bounds Checking), что предотвращает повреждение памяти.
  • Ковариантность: Массивы ссылочных типов ковариантны (например, string[] может быть присвоен переменной типа object[]), но это небезопасная операция с точки зрения типов.

Примеры создания и использования:

// Одномерный массив
int[] numbers = new int[5]; // Создание массива из 5 целых чисел (инициализированных 0)
numbers[0] = 10;
int firstElement = numbers[0];

// Инициализация при объявлении
string[] colors = { "Red", "Green", "Blue" };

// Многомерный (прямоугольный) массив
int[,] matrix = new int[2, 3]; // 2 строки, 3 столбца
matrix[1, 2] = 5;

// Ступенчатый (jagged) массив — массив массивов
int[][] jaggedArray = new int[3][];
jaggedArray[0] = new int[] { 1, 2 };
jaggedArray[1] = new int[] { 3, 4, 5 };

Под капотом: Массив хранит служебную информацию (указатель на тип, длину, ранк) и непосредственно за ней — элементы. Для типов-значений элементы хранятся "встроенно", для ссылочных типов хранятся ссылки на объекты.