ArrayList против списка <объект>
Вопрос
Я видел этот ответ от Джона Инициализировать универсальный объект неизвестного типа:
Однако, если вы хотите, чтобы одна коллекция содержит несколько не связанных типов значений, вам придется использовать
List<object>
я не сравниваю ArrayList
против List<>
, но ArrayList
против List<object>
, поскольку оба будут отображать элементы типа object
.Какая польза от использования любого из них в этом случае?
РЕДАКТИРОВАТЬ:Здесь не стоит беспокоиться о безопасности типов, поскольку оба класса раскрывают object
как его предмет.Еще нужно кастовать из object
до желаемого типа.Меня больше интересует что-то кроме безопасности типов.
РЕДАКТИРОВАТЬ:Спасибо Марку Грэвеллу и Шону за ответ.Извините, я могу выбрать только 1 ответ, поэтому проголосую за оба.
Решение
Вы сможете использовать методы расширения LINQ напрямую с List<object>
, но не с ArrayList
, если вы не введете Cast<object>()
/ OfType<object>
(благодаря IEnumerable<object>
против IEnumerable
).Это стоит немало, даже если вам не нужна безопасность типов и т. д.
Скорость будет примерно такой же;структуры по-прежнему будут упакованы в коробки и т. д., так что больше нечего будет отличать их друг от друга.За исключением того, что я склонен видеть ArrayList
как "упс, кто-то снова пишет устаревший код..." ;-p
Другие советы
Одно большое преимущество использования List<object>
заключается в том, что в наши дни большая часть кода пишется с использованием универсальных классов/интерфейсов.Я подозреваю, что в наши дни большинство людей напишут метод, требующий IList<object>
вместо IList
.С ArrayList
не реализует IList<object>
в этих сценариях вы не сможете использовать список массивов.
Я склонен думать о неуниверсальных классах/интерфейсах как о устаревшем коде и избегать их, когда это возможно.
В этом случае, ArrayList
против. List<Object>
тогда вы не заметите никакой разницы в скорости.Могут быть некоторые различия в фактических методах, доступных в каждом из них, особенно в .NET 3.5 и методах расширения подсчета, но это больше связано с тем, что ArrayList несколько устарел, чем с чем-либо еще.
Да, помимо типобезопасности, универсальные коллекции могут быть на самом деле быстрее.
Из MSDN (http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx)
А System.Collections.GenericПространство имен содержит интерфейсы и классы, которые определяют общие коллекции, которые позволяют пользователям создавать тесно напечатанные коллекции, которые обеспечивают лучшую безопасность и производительность типа, чем негенерические сборы.
Проведите сравнительный анализ, и вы поймете, что работает лучше всего.Я предполагаю, что разница очень мала.
List<> — это типобезопасная версия ArrayList.Это гарантирует, что вы получите в коллекции тот же тип объекта.