Что такое Capacity у списка (List) в C#?

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

Ответ

Capacity — это свойство класса List<T>, которое определяет общее количество элементов, которое внутренний массив списка может вместить без перераспределения памяти. Фактическое количество элементов в списке определяется свойством Count.

Как это работает: При создании списка выделяется внутренний массив. Когда вы добавляете элементы (Add) и Count достигает значения Capacity, происходит автоматическое увеличение емкости (обычно в 2 раза), что влечет за собой:

  1. Выделение нового, большего массива.
  2. Копирование всех существующих элементов из старого массива в новый.
  3. Продолжение работы с новым массивом.

Пример:

// Создаем список с начальной Capacity = 4
List<int> numbers = new List<int>(4);
Console.WriteLine(numbers.Capacity); // 4

numbers.Add(1); // Count = 1, Capacity = 4
numbers.AddRange(new[] { 2, 3, 4 }); // Count = 4, Capacity = 4
numbers.Add(5); // Count = 5, Capacity увеличивается до 8
Console.WriteLine(numbers.Capacity); // 8

Зачем это нужно и best practices:

  • Производительность: Перераспределение массива — дорогая операция. Если вы заранее знаете примерное количество элементов, указание начальной Capacity в конструкторе позволяет избежать множественных переаллокаций.
  • Соотношение Capacity и Count: Capacity всегда >= Count. Присвоение значения Capacity меньшего, чем текущий Count, выбросит ArgumentOutOfRangeException.
  • Оптимизация памяти: Если после массового удаления элементов Capacity значительно превышает Count, можно вызвать метод TrimExcess(), чтобы уменьшить Capacity ближе к Count (реализация не гарантирует точного равенства).
  • Прямое управление: Свойство Capacity имеет сеттер, но его использование требует осторожности.