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

В чём разница между массивом и List?

1.0 Junior🔥 191 комментариев
#Коллекции и структуры данных

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

Разница между массивом и List в C#

Массивы и List — это два разных способа хранения коллекций данных. Оба широко используются в Unity, но имеют разные характеристики и лучше подходят для разных сценариев.

Основные различия

1. Размер и динамичность

Массив имеет фиксированный размер, который определяется при создании:

int[] numbers = new int[10];  // Размер = 10, не может измениться
numbers[0] = 5;
// numbers[15] = 10;  // Ошибка! IndexOutOfRangeException

List динамически растёт по мере добавления элементов:

List<int> numbers = new List<int>();
numbers.Add(5);    // Размер = 1
numbers.Add(10);   // Размер = 2
numbers.Add(15);   // Размер = 3

2. Производительность

Массив быстрее при доступе и итерации:

int[] array = new int[1000000];
for (int i = 0; i < array.Length; i++)
{
    int value = array[i];  // Очень быстро
}

List немного медленнее из-за дополнительных проверок:

List<int> list = new List<int>();
for (int i = 0; i < list.Count; i++)
{
    int value = list[i];  // Немного медленнее
}

3. Использование памяти

Массив занимает ровно столько памяти, сколько элементов:

int[] array = new int[100];
// Память = 100 * 4 байта = 400 байт

List может занимать больше памяти, чем нужно, для оптимизации добавления элементов (capacity > count):

List<int> list = new List<int>(100);  // Capacity = 100
list.Add(1);  // Count = 1, но память выделена для 100 элементов

4. Методы и функциональность

Массив имеет базовые методы:

int[] array = { 3, 1, 2 };
Array.Sort(array);      // Сортировка
Array.Reverse(array);   // Разворот
int index = Array.IndexOf(array, 2);  // Поиск элемента
Array.Copy(array, newArray, 2);       // Копирование

List имеет много полезных методов:

List<int> list = new List<int> { 3, 1, 2 };
list.Add(4);           // Добавить
list.Remove(2);        // Удалить элемент
list.RemoveAt(0);      // Удалить по индексу
list.Insert(1, 5);     // Вставить на позицию
list.Contains(3);      // Проверить наличие
list.Clear();          // Очистить
list.Sort();           // Сортировка
list.ForEach(x => Debug.Log(x));  // Итерация

5. Инициализация

Массив инициализируется с фиксированным размером:

int[] array = new int[5];  // Размер 5
int[] array = { 1, 2, 3, 4, 5 };  // С элементами

List инициализируется пустым или с элементами:

List<int> list = new List<int>();  // Пусто
List<int> list = new List<int> { 1, 2, 3 };  // С элементами
List<int> list = new List<int>(10);  // Предварительный размер (capacity)

6. Передача параметров

Массив передаётся по ссылке (изменения видны вызывающему коду):

void ModifyArray(int[] array)
{
    array[0] = 999;  // Изменит оригинальный массив
}

int[] myArray = { 1, 2, 3 };
ModifyArray(myArray);
Debug.Log(myArray[0]);  // 999

List также передаётся по ссылке:

void ModifyList(List<int> list)
{
    list.Add(999);  // Изменит оригинальный список
}

List<int> myList = new List<int> { 1, 2, 3 };
ModifyList(myList);
Debug.Log(myList.Count);  // 4

Практические примеры в Unity

public class GameManager : MonoBehaviour
{
    // Используй массив для врагов, если их количество зафиксировано
    private Enemy[] waveenemies = new Enemy[10];
    
    // Используй List, если враги появляются динамически
    private List<Enemy> activeEnemies = new List<Enemy>();
    
    private void SpawnEnemy(Enemy enemy)
    {
        activeEnemies.Add(enemy);  // Просто добавь
    }
    
    private void RemoveEnemy(Enemy enemy)
    {
        activeEnemies.Remove(enemy);  // Просто удали
    }
    
    private void UpdateEnemies()
    {
        // List часто медленнее при итерации, но удобнее
        foreach (Enemy enemy in activeEnemies)
        {
            enemy.Update();
        }
    }
}

Когда что использовать

Используй массив когда:

  • Размер данных фиксирован и известен заранее
  • Нужна максимальная производительность
  • Часто итерируешь по всем элементам
  • Используешь большие объёмы данных

Используй List когда:

  • Размер коллекции неизвестен или меняется
  • Нужно часто добавлять/удалять элементы
  • Нужна удобная API (Add, Remove, Contains и т.д.)
  • Пишешь прототип (быстрее писать)

Производительность в Unity

Для критичной по производительности кода (сотни тысяч объектов) используй массивы. Для обычной игровой логики List достаточно удобен и быстр. В большинстве случаев разница незаметна для игрока, но помни о GC аллокациях при динамическом изменении List.