Почему ArrayList не помечен как устаревший?
После глубоких размышлений и изучения реализации ArrayList
Лично я действительно хочу сказать, что он устарел, у меня нет причин использовать этот класс после 2.0. Но так как он не помечен как [Obsolete]
, есть ли использование, которое я не знал, лучше, чем использование универсального класса? Если да, приведите пример. Благодарю.
РЕДАКТИРОВАТЬ Давайте возьмем List<T>
в качестве примера, он предоставляет все функции ArrayList
и это сильно напечатано. Итак, когда нам нужно использовать ArrayList
? Может быть, иногда он имеет лучшую производительность? Я не знаю. Я ценю, если вы можете показать мне что-то особенное ArrayList
,
3 ответа
Я думаю, что он должен считаться фактически устаревшим для нового кода, но нет веской причины отмечать его как устаревший и создавать предупреждения во всем коде, который был написан до выпуска 2.0.
По моему опыту, большинство типов и членов, которые были помечены Microsoft как устаревшие, в некотором отношении активно опасны, и их действительно следует исправить, если у вас все еще есть кодовая база, использующая их. При использовании ArrayList
является болезненным и (по крайней мере теоретически) склонным к обнаружению связанных с типом ошибок во время выполнения, а не во время компиляции, тип выполняет свою работу достаточно хорошо... часто действительно нет веских причин для изменения существующего кода. Это такое изменение, которое я обычно рассматривал, когда уже работал над областью кода, которая использовала ArrayList
вместо того, чтобы активно искать каждое использование этого.
На самом деле он полностью удален из Silverlight - так что намерение есть. Предположительно, существует слишком много старого существующего кода для обычного.NET, который использует ArrayList
устареть, особенно потому, что многие люди используют предупреждения как ошибки.
Вы не должны использовать его в новом коде без уважительной причины.
Это не "устарело" само по себе. Он "устарел" как автомобиль 70-80- х годов ранних 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
(но вы бы должны сравнить его)