ArrayList против списка в C#

в чем разница между ArrayList и List<> в C#?

только что List<> имеет тип while ArrayList не?

12 ответов


да, в значительной степени. List<T> является общим классом. Он поддерживает хранение значений определенного типа без приведения к или от object (что вызвало бы накладные расходы на бокс/распаковку, когда T тип значения в ArrayList case). ArrayList просто магазинах object ссылки. Как общая коллекция,List<T> реализует универсальный IEnumerable<T> интерфейс и может быть легко использован в LINQ (без каких-либо Cast или OfType звонок).

ArrayList принадлежит к Дням что в C# нет дженериков. Это устарело в пользу List<T>. Вы не должны использовать ArrayList в новом коде, предназначенном для .NET >= 2.0, Если вам не нужно взаимодействовать со старым API, который его использует.


используя 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


чтобы добавить к вышеуказанным пунктам. Используя ArrayList в 64-битной операционной системе требуется 2x память, чем в 32-битной операционной системе. Между тем, общий список List<T> будет использовать гораздо меньше памяти, чем ArrayList.

например, если мы используем ArrayList 19MB в 32-битном это займет 39MB в 64-битном. Но если у вас есть общий список List<int> из 8MB в 32-битном потребуется только 8.1 MB в 64-битном, что является разницей 481% по сравнению с ArrayList.

источник: ArrayList против общего списка для примитивных типов и 64-бит


еще одно различие, которое нужно добавить, касается синхронизации потоков.

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

List<T> не обеспечивает синхронизацию потоков; код пользователя должен обеспечивать синхронизацию всех элементов при одновременном добавлении или удалении элементов в нескольких потоках.

подробнее здесь синхронизация потоков в .Net Framework


ArrayList не являются безопасными, тогда как List<T> безопасный тип. Простой.):


простой ответ:

ArrayList не является общим

  • это тип объекта, поэтому вы можете хранить в нем любой тип данных.
  • вы можете хранить любые значения (тип значения или ссылочный тип), такие как string, int, employee и object в ArrayList. (Примечание и)
  • упаковка и распаковка произойдет.
  • Не типа безопасный.
  • он старше.

список Generic

  • это тип типа, поэтому вы можете указать 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/

enter image description here

Примечание: вы должны знать дженерики, прежде чем понимать разницу:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/


ArrayList - Это коллекции данных разных типов, тогда как List<> коллекция подобного типа своя depedencties.


я думаю, различия между ArrayList и List<T> являются:

  1. List<T>, где T-тип значения быстрее, чем ArrayList. Это потому что List<T> избегает бокса / распаковки (где T-тип значения).
  2. многие источники говорят о - обычно ArrayList используется только для обратной совместимость. (это не реальная разница, но я думаю, что это важное Примечание.)
  3. отражение легче с неуниверсальных ArrayList затем List<T>
  4. ArrayList и IsSynchronized собственность. Так что, это легко для создания и использования syncronised 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
    
  5. 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 может хранить несколько типов объектов.
  • В общем списке (списке) 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