Массивы не изменяемыми потому , что как работает память. Получение того, как распределение памяти работает именно в .NET, немного для SO-ответа, вы можете прочитать все об этом в другом месте, если хотите, но один аспект в основном универсален для каждой платформы: когда у вас есть часть памяти, выделенная для чего-то , следующий адрес после того, что что-то может быть частью какой-то другой вещи.
Таким образом, вы не можете просто расширить кусочек памяти и надеяться, что ничего не получится, вам нужно будет проверить, что вы можете расширить его и иметь план B, если вы не можете, - этот план B будет выделять новый блок памяти, копирование старой вещи в нее и освобождение старого блока.
Чтобы избежать перераспределения и копирование много раз, это обычная практика, чтобы сделать новый блок в два раза больше старый блок, так что если вы добавляете n
детали, вы только перераспределить & Копируйте O(log n)
раз, сохраняя amortized time for adding a new item to a dynamically-grown array down to O(1). Так что постоянное время, здорово - не совсем. Это еще больше времени, чем если бы вам не приходилось перераспределять, и на самом деле даже каждый add
, что не, приводит к тому, что у роста есть немного накладных расходов, чтобы убедиться, что рост еще не требуется.
Итак, массивы, которые не растут, намного проще, немного быстрее и теряют память. Таким образом, в C# (и многих других языках, таких как Java и C++) вы можете выбрать: хотите ли вы использовать растущую «массивную вещь» или нерушимую? Там есть компромисс, и эти языки предпочитают не принимать это решение за вас.
Поскольку вы не можете изменить коллекцию, которую вы перечисляете в цикле foreach –
'Array' не содержит метода' Add', поэтому вы должны использовать объект типа «Список» уже ... –
Разве это не просто дублирование вашего элементы массива? – Sayse