ArrayList vs List <> в С#
В чем разница между ArrayList
и List<>
в С#?
Это только то, что List<>
имеет тип, а ArrayList
- нет?
Ответы
Ответ 1
Да, в значительной степени. List<T>
- общий класс. Он поддерживает сохранение значений определенного типа без кастования в или из object
(что привело бы к потере бокс /unboxing, когда T
является типом значения в случае ArrayList
). ArrayList
просто хранит ссылки object
. В качестве общей коллекции List<T>
реализует общий интерфейс IEnumerable<T>
и может быть легко использован в LINQ (без необходимости вызова Cast
или OfType
).
ArrayList
относится к дням, когда у С# не было дженериков. Он устарел в пользу List<T>
. Вы не должны использовать ArrayList
в новом коде, который нацелен на .NET >= 2.0, если вам не нужно взаимодействовать со старым API, который его использует.
Ответ 2
Используя List<T>
, вы можете предотвратить ошибки в литье. Очень полезно избегать ошибки каста выполнения.
Пример:
Здесь (используя ArrayList
) вы можете скомпилировать этот код, но позже вы увидите ошибку выполнения.
ArrayList array1 = new ArrayList();
array1.Add(1);
array1.Add("Pony"); //No error at compile process
int total = 0;
foreach (int num in array1)
{
total += num; //-->Runtime Error
}
Если вы используете List
, вы избегаете этих ошибок:
List<int> list1 = new List<int>();
list1.Add(1);
//list1.Add("Pony"); //<-- Error at compile process
int total = 0;
foreach (int num in list1 )
{
total += num;
}
Ссылка:
MSDN
Ответ 3
Чтобы добавить к вышеуказанным пунктам. Использование ArrayList
в 64-битной операционной системе занимает 2x память, чем использование в 32-разрядной операционной системе. Между тем, общий список List<T>
будет использовать значительно меньшую память, чем ArrayList
.
например, если мы используем ArrayList
из 19 МБ в 32-битной системе, в 64-битной системе потребуется 39 МБ. Но если у вас есть общий список List<int>
из 8 МБ в 32-битном, он будет принимать только 8,1 МБ в 64-битной версии, что составляет 481% разницу по сравнению с ArrayList.
Источник: ArrayLists против общего списка для примитивных типов и 64-бит
Ответ 4
Еще одно отличие заключается в отношении синхронизации потоков.
ArrayList
обеспечивает некоторую безопасность потоков через свойство Synchronized, которое возвращает потокобезопасную оболочку вокруг коллекции. Обертка работает, блокируя всю коллекцию при каждой операции добавления или удаления. Поэтому каждый поток, пытающийся получить доступ к коллекции, должен дождаться, пока его очередь займет один замок. Это не является масштабируемым и может вызвать значительное ухудшение производительности для больших коллекций.
List<T>
не обеспечивает синхронизацию потоков; код пользователя должен обеспечивать всю синхронизацию, когда элементы добавляются или удаляются одновременно в нескольких потоках.
Подробнее здесь Синхронизация потоков в .NET Framework
Ответ 5
Простой ответ:
ArrayList не является универсальным
- Это тип объекта, поэтому вы можете хранить в нем любой тип данных.
- Вы можете хранить любые значения (тип значения или ссылочный тип), такие как строка, int, employee и object, в ArrayList. (Примечание и)
- Произойдет бокс и распаковка.
- Не безопасно типа.
- Это старше.
Список является общим
- Это тип типа, так что вы можете указать T во время выполнения.
- Вы можете хранить единственное значение типа T (строка или int, сотрудник или объект) на основе объявления. (Примечание или)
- Бокса и распаковки не будет.
- Введите безопасный.
- Это новее.
Пример:
ArrayList arrayList = new ArrayList();
List<int> list = new List<int>();
arrayList.Add(1);
arrayList.Add("String");
arrayList.Add(new object());
list.Add(1);
list.Add("String"); // Compile-time Error
list.Add(new object()); // Compile-time Error
Пожалуйста, прочтите официальный документ Microsoft: https://blogs.msdn.microsoft.com/kcwalina/2005/09/23/system-collections-vs-system-collection-generic-and-system-collections-objectmodel/
![enter image description here]()
Примечание. Перед тем, как понимать разницу, вы должны знать общие сведения: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/
Ответ 6
ArrayList
- это коллекции данных разных типов, тогда как List<>
представляет собой совокупность аналогичных типов собственных депектенций.
Ответ 7
ArrayList
не являются безопасными типа, тогда как List<T>
безопасны по типу. Простой:).
Ответ 8
Я думаю, что различия между ArrayList
и List<T>
:
List<T>
, где T - тип значения, быстрее, чем ArrayList
. Это
потому что List<T>
избегает упаковки/распаковки (где T - тип значения).
- Многие источники говорят - обычно
ArrayList
используется только для обратной
совместимость. (это не реальная разница, но я думаю, что это
важное примечание).
- Отражение легче с неуниверсальным
ArrayList
, чем List<T>
ArrayList
имеет свойство IsSynchronized
. Так легко
создать и использовать синхронизированный ArrayList
. Я не нашел свойства IsSynchronized
для List<T>
. Также имейте в виду, что этот тип синхронизации относительно неэффективен, msdn):
var arraylist = new ArrayList();
var arrayListSyncronized = ArrayList.Synchronized(arraylist
Console.WriteLine($"syncronized {arraylist.IsSynchronized}");
Console.WriteLine($"syncronized {arrayListSyncronized.IsSynchronized}");
var list = new List<object>();
var listSyncronized = ArrayList.Synchronized(list);
Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
ArrayList
имеет свойство ArrayList.SyncRoot
, которое можно использовать для синхронизации (msdn). List<T>
не имеет свойства SyncRoot
, поэтому в
В следующей конструкции вам нужно использовать какой-то объект, если вы используете List<T>
:
ArrayList myCollection = new ArrayList();
lock(myCollection.SyncRoot) // ofcourse you can use another object for this goal
{
foreach (object item in myCollection)
{
// ...
}
}
Ответ 9
Как упомянуто в .a Framework документации
Мы не рекомендуем использовать класс ArrayList
для новых развитие. вместо этого мы рекомендуем использовать общий List<T>
класс. Класс ArrayList
предназначен для хранения разнородных коллекции предметов. Тем не менее, он не всегда предлагает лучшее представление. Вместо этого мы рекомендуем следующее:
- Для гетерогенной коллекции объектов используйте тип
List<Object>
(в С#) или List(Of Object)
(в Visual Basic).
- Для однородной коллекции объектов используйте класс
List<T>
.
Смотрите также Неуниверсальные коллекции не должны использоваться
![table shows how the non-generic collection types can be replaced by their generic counterparts]()
Ответ 10
Используя "Список", вы можете предотвратить ошибки в литье. Очень полезно избегать ошибки каста выполнения.
Пример:
Здесь (используя ArrayList) вы можете скомпилировать этот код, но позже вы увидите ошибку выполнения.
// Create a new ArrayList
System.Collections.ArrayList mixedList = new System.Collections.ArrayList();
// Add some numbers to the list
mixedList.Add(7);
mixedList.Add(21);
// Add some strings to the list
mixedList.Add("Hello");
mixedList.Add("This is going to be a problem");
System.Collections.ArrayList intList = new System.Collections.ArrayList();
System.Collections.ArrayList strList = new System.Collections.ArrayList();
foreach (object obj in mixedList)
{
if (obj.GetType().Equals(typeof(int)))
{
intList.Add(obj);
}
else if (obj.GetType().Equals(typeof(string)))
{
strList.Add(obj);
}
else
{
// error.
}
}
Ответ 11
Мне все известно о ваших данных. Если я продолжу расширять свой код на основе эффективности, мне нужно будет выбрать параметр "Список" в качестве способа дешифрования моих данных без ненужного шага, всегда задающегося вопросом о типах, особенно "Пользовательские типы". Если машина понимает разницу и может определить на ней какие типы данных, с которыми я действительно сталкиваюсь, то почему я должен мешать и тратить время на круговое движение "ЕСЛИ ТОЛЬКО ELSE"? Моя философия - позволить машине работать вместо меня, работая на машине? Знание уникальных различий между командами различных объектов кода дает долгий путь в создании эффективного кода.
Том Джонсон
(Один вход... Один выход)
Ответ 12
Это не только разница. К членам ArrayList можно получить доступ через индекс, например, обычные массивы, а также члены ArrayList могут легко отсортироваться в прямом и обратном порядке, а два ArrayList могут быть легко объединены, что не относится к простому списку. Подробнее о
http://www.cirvirlab.com/index.php/c-sharp-code-examples/112-c-sharp-arraylist-example.html