Недавно я ответил на вопрос Как добавить элементы в массив в C#? и пока я предлагал альтернативное решение, которое заключалось в использовании класса List
, я напомнил себе, что есть еще класс с именем ArrayList
.
При сравнении документации ArrayList и List в некоторых частях этих статей говорится:
«Класс ArrayList предназначен для хранения разнородных коллекций объектов. Однако он не всегда обеспечивает наилучшую производительность».
А также
«Класс List работает лучше всего в большинстве случаев и является типобезопасным».
Затем статья List
пытается объяснить, почему она работает List
лучше, но это та часть, которую я не понимаю. Он буквально говорит:
«Для списка, если тип значения используется для типа T, компилятор создает реализацию класса List специально для этого типа значения. Это означает, что элемент списка объекта списка не должен быть упакован до того, как элемент может быть использовал."
«Для списка, если тип используется для типа в списке, компилятор создает реализацию класса List специально для этого значения типа. Это означает, что элемент списка объекта List не должен быть заключен в оболочку перед ним. можно использовать».
*Бесплатный перевод от меня
В чем на самом деле разница между ArrayList и List и почему говорят, что List имеет лучшую производительность?
PS: +10 брауни-баллов любому, кто скажет мне, что я должен понимать под «в штучной упаковке» в этом абзаце, что правда в том, что я не смог очень хорошо это перевести. Редактировать: Flxtr взял очки домового.
ArrayList
— это класс, который был создан с версии 1 C# и .NET Framework до того , как были добавлены Generics , и этоList<T>
класс, который заменил его, начиная с C# 2, .NET Framework 2.0 и VB.NET 2008 (8.0) и далее.Основное отличие состоит в том, что экземпляр
ArrayList
позволяет добавлять в коллекцию несколько типов.Пример:
С#
ВБ
Хотя ему
List<T>
нужно, чтобы тип элементов списка был определен при его созданииС#
ВБ
А насчет производительности разница в сроках бокс и распаковка
Упаковка относится к факту обертывания значения типа Reference type (например
int
,char
, ,float
,double
, ... среди прочих) внутри ссылки, если оно должно быть присвоено переменной или параметру типаobject
. Распаковка относится к обратному процессу, то есть к получению значения объекта в переменной типа ссылочного типа .Проблема в том, что этот процесс упаковки и распаковки происходит в случае
ArrayList
добавления или получения значения.Примеры:
С#
ВБ
Этот процесс занимает время выполнения, поэтому он медленнее, чем общий случай.
В общем случае с
List<T>
этим процессом его не существует, поскольку компилятор генерирует код для точных типов данных (в данном случаеint
) и не требует какого-либо преобразования.С#
ВБ
Рекомендую всегда пользоваться
List<T>
правдой, я не знаю случая, когда ее удобно использоватьArrayList
, так как она хоть и не отмечена как устаревшая, но на практике уже не используется.По сути, ArrayList необходимо упаковывать и распаковывать каждый раз, когда элемент массива сохраняется/доступен. Это так, потому что ArrayList хранит ссылки на объекты типа object, поэтому ему необходимо постоянно выполнять задачу приведения.
С другой стороны, List не нужно выполнять эту задачу, поскольку компилятор реализует конкретный (специализированный?) список для работы с типом T. По этой причине он также более безопасен (хотя и не обеспечивает визуального порядка).
Разницу можно понять так:
Объявляя список, вы присваиваете ему тип (String, integer, Boolean), и по мере добавления элементов это процесс присвоения значений определенного типа сектору памяти.
Вместо этого ArrayList преобразует полученную информацию в совершенно новый объект перед выделением места в памяти (упаковкой) и т. д. для каждого элемента в arrayList. При его чтении вы должны не только получить его из оперативной памяти, но и «создать» его и все его свойства. который потребляет много ресурсов
Класс List(Of T) -T относится к типу (фиксированный тип) - очень мощный. Одним из его лучших качеств является реализация интерфейса IEnumerable(Of T), который обеспечивает доступ ко многим методам. Объект этого класса можно легко преобразовать в массив с помощью метода ToArray. Мы можем прочитать документацию MSDN об этом классе по адресу: List(Of T) в MSDN .
Важным преимуществом List(Of T) является то, что объекты этого класса могут быть частью запросов языка LINQ, что позволяет нам преобразовывать списки объектов одного типа в списки объектов другого типа или в статистический объект в качестве первого элемента запрос.список, последний, максимальный, минимальный... LINQ