Почему ArrayList не помечен как устаревший? - PullRequest
38 голосов
/ 21 февраля 2011

После глубоких размышлений и изучения реализации ArrayList лично я действительно хочу сказать Это устарело, у меня нет причин использовать этот класс после 2.0 . Но так как он не помечен как [Obsolete], есть ли какое-то использование, которое я не знал, лучше, чем использование универсального класса? Если да, приведите пример. Спасибо.

РЕДАКТИРОВАТЬ Давайте возьмем List<T> в качестве примера, он предоставляет все функции ArrayList и строго типизирован. Итак, когда нам нужно использовать ArrayList? Может быть, иногда он имеет лучшую производительность? Я не знаю. Я ценю, если вы можете показать мне что-то особенное из ArrayList.

Ответы [ 3 ]

47 голосов
/ 21 февраля 2011

Я думаю, что для нового кода его следует считать фактически устаревшим, но нет веской причины отмечать его как устаревший и создавать предупреждения во всем коде, который был написан до выпуска 2.0.

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

15 голосов
/ 21 февраля 2011

На самом деле он полностью удален из Silverlight - так что намерение есть. Предположительно, существует слишком много старого существующего кода для обычной .NET, который использует ArrayList для его устаревания, тем более что многие люди работают с предупреждениями как ошибки.

Вы не должны использовать его в новом коде без уважительной причины.

5 голосов
/ 21 февраля 2011

Само по себе оно не «устарело». Он "устарел" как автомобиль '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 (но вам придется его тестировать)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...