Почему 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 (но вам нужно было бы сравнить его)