Подтвердить что ты не робот

Что не так с ArrayList?

Недавно я задал вопрос о SO, который упомянул о возможном использовании С# ArrayList для решения. Было сделано замечание о том, что использование arraylist плохое. Я хотел бы больше узнать об этом. Я никогда не слышал этого заявления до того, как расскажу о арраилах. мог бы кто-нибудь привести меня к скорости на возможные проблемы с производительностью с использованием arraylists

С#..net-2

4b9b3361

Ответ 1

Основная проблема с ArrayList заключается в том, что используется object - это означает, что вам нужно отбрасывать и от того, что вы инкапсулируете. Это остатки дней до дженериков и, вероятно, для обратной совместимости.

У вас нет безопасности типа с ArrayList, который у вас есть с общим списком. Проблема производительности заключается в необходимости отбрасывать объекты обратно в исходное (или иметь неявный бокс).

Неявный бокс будет происходить всякий раз, когда вы используете тип значения - он будет помещен в коробку, когда будет помещен в ArrayList и unboxed, когда будет указано.

Проблема не только в производительности, но и в отношении удобочитаемости и правильности. Поскольку появились дженерики, этот объект стал устаревшим и понадобится только в коде .NET 1.0/1.1.

Ответ 2

Если вы сохраняете тип значения (int, float, double и т.д.) или любую структуру), ArrayList будет приводить к боксу на каждом хранилище и распаковке при каждом доступе к элементу. Это может стать значительным достижением производительности.

Кроме того, в ArrayList отсутствует полное отсутствие безопасности типов. Поскольку все хранится как "объект", на вас, как разработчика, накладывается дополнительное бремя, чтобы оно было безопасным.

Кроме того, если вы хотите поведение хранения объектов, вы всегда можете использовать List<object>. Для ArrayList нет недостатка, и у него есть одно большое преимущество (IMO): он делает ваше намерение (сохранение нетипизированного объекта) с самого начала.

ArrayList действительно существует и должен использоваться только для кода .NET 1.1. В .NET 2 + нет причин использовать его.

Ответ 3

Общий List<T> является предпочтительным, поскольку он является общим, который предоставляет дополнительную информацию о типе и устраняет необходимость в типах полей box/unbox добавлено к нему.

Ответ 4

ArrayList не является общим типом, поэтому он должен хранить все элементы, которые вы размещаете в нем как объекты. Это плохо по двум причинам. Во-первых, при установке типов значений в ArrayList вы вынуждаете компилятор вводить тип значения в ссылочный тип, который может быть дорогостоящим. Во-вторых, теперь вам нужно бросить все, что вы выберете из списка массивов. Это плохо, так как теперь вам нужно убедиться, что вы знаете, какие объекты там.

Список избегает этих проблем, поскольку он построен с соответствующим типом. Например:

List<int> ints =  new List<int>();
ints.Add(5); //no boxing
int num = ints[0]; // no casting

Ответ 5

Помимо проблем с производительностью, это вопрос переноса ошибок из среды выполнения для компиляции времени. Объекты каста, полученные из ArrayList, должны выполняться во время выполнения, и во время выполнения будут возникать ошибки любого типа. Используя общий List<>, все типы проверяются во время компиляции.

Ответ 6

Все бокс и распаковка могут быть дорогими и хрупкими. Microsoft сделала несколько приятных улучшений в плане ввода и производительности в генераторах .NET 2.0.

Вот несколько хороших отзывов: