12 ответов:
да, в значительной степени.
List<T>- Это универсальный класс. Он поддерживает хранение значений определенного типа без приведения к или отobject(что привело бы к накладным расходам на бокс/распаковку, когдаTтип значения вArrayListcase).ArrayListпросто магазинахobjectссылки. Как общая коллекция,List<T>реализует универсальныйIEnumerable<T>интерфейс и может быть легко использован в LINQ (не требуя каких-либоCastилиOfTypeзвонок).
ArrayListпринадлежит к Дням у этого C# не было дженериков. Это устарело в пользуList<T>. Вы не должны использоватьArrayListв новом коде, предназначенном для .NET >= 2.0, Если вам не нужно взаимодействовать со старым API, который его использует.
используя
List<T>вы можете предотвратить ошибки литья. Это очень полезно, чтобы избежать runtime ошибка кастинга.пример:
здесь (используя
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
добавить к вышеперечисленным пунктам. Используя
ArrayListв 64-битной операционной системе занимает 2x памяти, чем использование в 32-битной операционной системе. Между тем, общий списокList<T>будет использовать гораздо меньше памяти, чемArrayList.например, если мы используем
ArrayListиз 19 МБ в 32-битном это займет 39 МБ в 64-битном. Но если у вас есть общий списокList<int>из 8 МБ в 32-битном это займет всего 8,1 МБ в 64-битном, что является громким 481% разница по сравнению с ArrayList.источник: ArrayList против общего списка для примитивных типов и 64-бит
еще одно различие, которое нужно добавить, касается синхронизации потоков.
ArrayListобеспечивает некоторую потокобезопасность через свойство Synchronized, которое возвращает потокобезопасную оболочку вокруг коллекции. Оболочка работает путем блокировки всей коллекции при каждой операции добавления или удаления. Поэтому каждый поток, который пытается получить доступ к коллекции, должен ждать своей очереди, чтобы получить одну блокировку. Это не масштабируемо и может привести к значительной производительности деградация для больших коллекций.
List<T>не обеспечивает никакой синхронизации потоков; пользовательский код должен обеспечить всю синхронизацию, когда элементы добавляются или удаляются в нескольких потоках одновременно.подробнее здесь синхронизация потоков в .Net Framework
простой ответ:
ArrayList не является общим
- это тип объекта, поэтому вы можете хранить в нем любой тип данных.
- вы можете хранить любые значения (тип значения или ссылочный тип), такие как string, int, employee и object в ArrayList. (Примечание и)
- упаковка и распаковка произойдет.
- Не типа безопасный.
- он старше.
список Универсальный
- это тип типа, поэтому вы можете указать T во время выполнения.
- вы можете хранить только значение типа T (string или int или employee или object) на основе объявления. (Примечание или)
- упаковка и распаковка не будет.
- тип безопасный.
- он новее.
пример:
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/
Примечание: вы должны знать, дженерики, прежде чем понять разницу: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/
ArrayListЭто коллекции данных разных типов, тогда какList<>- это коллекция подобных типов собственных depedencties.
я думаю, различия между
ArrayListиList<T>являются:
List<T>, где T-тип значения быстрее, чемArrayList. Это потому чтоList<T>избегает бокса / распаковки (где T-тип значения).- многие источники говорят о - обычно
ArrayListиспользуется только для обратной совместимость. (это не реальная разница, но я думаю, что это важное Примечание.)- отражение легче с неуниверсальных
ArrayListзатемList<T>
ArrayListиIsSynchronizedсобственность. Так что, это легко для создания и использования syncronisedArrayList. Я не нашел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) { // ... } }
- ArrayList не имеет ограничения типа для хранения данных, т. е. это не Типобезопасно. Вы можете хранить все, что угодно в ArrayList. На самом деле один и тот же ArrayList может хранить несколько типов объектов.
- В общем списке (List) T означает тип данных, т. е. string, int, DateTime и т. д. Таким образом, он будет хранить только определенные типы объектов на основе того, какой тип данных был указан при объявлениях, т. е. он является типобезопасным. Таким образом, если у вас есть общий список строк, вы можете хранить только строку значения, что-нибудь еще даст ошибку компиляции. Получение данных обратно также хлопот бесплатно и не требуется преобразование типов
С помощью "списка" вы можете предотвратить ошибки литья. Это очень полезно, чтобы избежать ошибки во время выполнения заброса.
пример:
здесь (с помощью 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. } }
для меня это все о знании ваших данных. Если я продолжаю расширять свой код на основе эффективности, мне придется выбрать опцию списка как способ расшифровки моих данных без ненужного шага всегда задаваться вопросом о типах, особенно "пользовательские типы". Если машина понимает разницу и может определить, с каким типом данных я на самом деле имею дело, то почему я должен мешать и тратить время, проходя через вращения определений "если тогда еще"? Мой философия состоит в том, чтобы позволить машине работать на меня вместо того, чтобы я работал на машине? Знание уникальных различий различных команд объектного кода имеет большое значение для повышения эффективности вашего кода.
Тома Джонсона (одна запись. .. Один Выход)
Это не только разница. Члены ArrayList могут быть доступны через индекс, как обычные массивы, а также члены ArrayList могут легко сортироваться в прямом и обратном порядке, и два ArrayList могут быть легко объединены, что не относится к простому списку. Смотрите подробнее на
http://www.cirvirlab.com/index.php/c-sharp-code-examples/112-c-sharp-arraylist-example.html

Comments