В чём разница между массивом и List?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Разница между массивом и 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.