← Назад к вопросам

Что такое ArrayList?

2.0 Middle🔥 121 комментариев
#Основы C# и .NET

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое ArrayList в C#

ArrayList — это коллекция в языке C#, представленная в пространстве имен System.Collections, которая представляет собой динамический массив объектов. В отличие от стандартных массивов, которые имеют фиксированный размер, ArrayList может автоматически изменять свою вместимость при добавлении или удалении элементов.

Основные характеристики ArrayList

  • Динамическое изменение размера: Не требует предварительного указания размера. Вместимость увеличивается автоматически по мере необходимости.
  • Хранение объектов: Может хранить элементы любого типа, так как все они неявно приводятся к типу object. Это делает коллекцию гетерогенной (может содержать элементы разных типов).
  • Индексированный доступ: Поддерживает доступ к элементам по индексу, как и обычный массив.
  • Реализация интерфейсов: Реализует интерфейсы IList, ICollection, IEnumerable и ICloneable.

Создание и базовые операции

using System.Collections;

// Создание ArrayList
ArrayList myArrayList = new ArrayList();

// Добавление элементов (разных типов)
myArrayList.Add(42);               // int (будет упакован в object)
myArrayList.Add("Hello World");    // string
myArrayList.Add(3.14);             // double
myArrayList.Add(new DateTime(2023, 1, 1)); // DateTime

// Доступ по индексу
object firstElement = myArrayList[0]; // Получим 42 (как object)
string secondElement = (string)myArrayList[1]; // Приведение типа

// Вставка по индексу
myArrayList.Insert(1, "Вставленный элемент");

// Удаление элементов
myArrayList.Remove("Hello World"); // Удаление по значению
myArrayList.RemoveAt(0);           // Удаление по индексу

// Проверка наличия элемента
bool containsPi = myArrayList.Contains(3.14);

// Получение количества элементов
int count = myArrayList.Count;

// Получение текущей вместимости (Capacity) - может быть >= Count
int capacity = myArrayList.Capacity;

Преимущества ArrayList

  • Гибкость размера: Не нужно заботиться о переполнении, как в случае с обычными массивами.
  • Удобные методы: Богатый набор методов для манипуляции данными (AddRange, InsertRange, Sort, Reverse и др.).
  • Совместимость: Часто используется в legacy-коде и с API, которые требуют коллекций из пространства имен System.Collections.

Недостатки и проблемы

  1. Отсутствие типобезопасности: Поскольку все элементы хранятся как object, необходимы явные приведения типов, что может привести к исключению InvalidCastException во время выполнения.

    ArrayList list = new ArrayList() { 1, 2, "три" };
    int sum = 0;
    foreach (object item in list)
    {
        // Ошибка времени выполнения на строке "три"
        sum += (int)item;
    }
    
  2. Упаковка (Boxing) и распаковка (Unboxing): При добавлении значимых типов (value types) происходит упаковка в объект, а при извлечении — распаковка. Это снижает производительность из-за накладных расходов и выделения памяти в управляемой куче.

    ArrayList list = new ArrayList();
    list.Add(123); // Boxing происходит здесь
    int value = (int)list[0]; // Unboxing происходит здесь
    
  3. Менее эффективное использование памяти: Из-за хранения всего как object и механизма динамического изменения размера (который обычно удваивает вместимость при необходимости).

Почему ArrayList считается устаревшим?

С появлением обобщений (generics) в .NET Framework 2.0, была представлена коллекция List<T> в пространстве имен System.Collections.Generic, которая решает основные проблемы ArrayList.

Сравнение ArrayList и List<T>:

// Устаревший подход с ArrayList (небезопасный)
ArrayList arrayList = new ArrayList();
arrayList.Add(10);
arrayList.Add(20);
// arrayList.Add("строка"); // Ошибка проявится только при запуске

int sumArrayList = 0;
foreach (int item in arrayList) // Может выбросить InvalidCastException
{
    sumArrayList += item;
}

// Современный подход с List<T> (типобезопасный)
List<int> genericList = new List<int>();
genericList.Add(10);
genericList.Add(20);
// genericList.Add("строка"); // Ошибка компиляции - сразу видна

int sumGenericList = 0;
foreach (int item in genericList) // Гарантированно безопасно
{
    sumGenericList += item;
}

Когда (очень редко) можно использовать ArrayList сегодня?

  1. Работа с унаследованным кодом, который активно использует ArrayList.
  2. Необходимость хранить элементы абсолютно разных типов в одной коллекции (хотя в этом случае часто лучше использовать List<object> или специализированные решения).
  3. Взаимодействие с API, которые требуют именно ArrayList или необобщенные коллекции.

Заключение

ArrayList — важная часть истории развития .NET, которая демонстрирует эволюцию подходов к работе с коллекциями. Однако для нового кода настоятельно рекомендуется использовать обобщенные коллекции, в частности List<T>, которые обеспечивают:

  • Типобезопасность на уровне компиляции
  • Лучшую производительность за счет избегания упаковки/распаковки
  • Более чистый и читаемый код с явным указанием типов

Понимание ArrayList важно для поддержки legacy-кода и для глубокого понимания архитектуры коллекций в .NET, но в современной разработке это коллекция, от использования которой следует отказаться в пользу обобщенных альтернатив.

Что такое ArrayList? | PrepBro