Ответ
Capacity — это свойство класса List<T>, которое определяет общее количество элементов, которое внутренний массив списка может вместить без перераспределения памяти. Фактическое количество элементов в списке определяется свойством Count.
Как это работает:
При создании списка выделяется внутренний массив. Когда вы добавляете элементы (Add) и Count достигает значения Capacity, происходит автоматическое увеличение емкости (обычно в 2 раза), что влечет за собой:
- Выделение нового, большего массива.
- Копирование всех существующих элементов из старого массива в новый.
- Продолжение работы с новым массивом.
Пример:
// Создаем список с начальной 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имеет сеттер, но его использование требует осторожности.