Почему ArrayList не отмечен [Устаревший]?
После глубокой мысли и изучения реализации ArrayList
лично я действительно хочу сказать Это устарело, у меня есть нет причин использовать этот класс после 2.0. Но поскольку он не помечен как [Obsolete]
, существует ли какое-либо использование, которое я не знал, лучше, чем использование общего класса? Если да, просьба привести пример. Спасибо.
EDIT. Возьмем List<T>
в качестве примера, он предоставляет все функции ArrayList
, и он строго типизирован. Итак, когда нам нужно использовать ArrayList
? Может быть, иногда это имеет лучшую производительность? Я не знаю. Я ценю, если вы можете показать мне что-то особенное ArrayList
.
Ответы
Ответ 1
Я думаю, что это должно считаться эффективно устаревшим для нового кода, но нет никаких веских оснований для его устаревания и создания предупреждений во всем коде, который был написан до 2.0.
По моему опыту, большинство типов и членов, которые Microsoft помечают как устаревшие, в какой-то мере активно опасны и действительно должны быть исправлены, если у вас все еще есть код, использующий их. Хотя использование ArrayList
является болезненным и (по крайней мере теоретически) склонным к обнаружению ошибок, связанных с типом во время выполнения, а не времени компиляции, тип делает свою работу достаточно хорошо... часто действительно нет веских причин для изменения существующего кода. Это то изменение, которое я обычно рассматривал, когда я уже работал над областью кода, которая использовала ArrayList
, вместо того, чтобы активно искать все ее использование.
Ответ 2
На самом деле он полностью удаляется из Silverlight - поэтому есть намерение. Предположительно, существует слишком много старого существующего кода для обычного .NET, который использует ArrayList
для его устаревания, тем более, что многие люди работают с предупреждениями как ошибки.
Вы не должны использовать его в новом коде без уважительной причины.
Ответ 3
Это не "устаревший" как таковой. Он "устарел" как автомобиль '70 '80 early '90. Если бы мне пришлось выбирать между List<Object>
и ArrayList
, существует ОЧЕНЬ ОЧЕНЬ МАЛЕНЬКАЯ возможность использовать ArrayList... Забудьте об этом... Он не реализует IEnumerable<Object>
, поэтому использовать Linq я бы должны использовать OfType<Object>()
.
Чтобы сделать пример:
var aaa = new ArrayList();
var aaaa = aaa.OfType<object>().Where(p => p != null);
var bbb = new List<object>;
var bbbb = bbb.Where(p => p != null);
Кто-то наконец поддержал мой ответ, поэтому я добавлю что-то к нему: -)
Если бы вы спросили: "Используете ли вы какую-либо коллекцию, не относящуюся к генерации", мой ответ был бы другим. Hashtable имеет интересное свойство:
Hashtable является потокобезопасным для использования несколькими потоками считывателей и одним потоком записи. Он является потокобезопасным для многопоточного использования, когда только один из потоков выполняет операции записи (обновления), что позволяет читать без блокировки при условии, что авторы сериализуются в Hashtable.
Итак, есть места, где Hashtable
должен быть лучше, чем lock + Dictionary
или ConcurrentDictionary
(но вам нужно было бы сравнить его)