Неуниверсальные коллекции в .NET устарели?

Иначе говоря:

Есть ли веская причина выбрать коллекцию со слабой типизацией, а не типобезопасную (HashTable или Dictionary)? Они еще там только для совместимости?

Насколько я понимаю, универсальные коллекции не только безопасны по типу, но и работают лучше.


Вот исчерпывающая статья по этой теме: Расширенная проверка данных Структуры, использующие C # 2.0.


person guillermooo    schedule 11.09.2008    source источник


Ответы (8)


Неуниверсальные коллекции настолько устарели, что были удалены из CoreCLR, используемого в Silverlight и Live Mesh.

person Curt Hagenlocher    schedule 11.09.2008
comment
А что насчет System.Collections.BitArray? На самом деле нет универсального эквивалента. - person Triynko; 23.12.2015
comment
@Triynko a BitArray - это строго типизированная коллекция логических значений со специальным использованием, а не слабо типизированная высоко абстрактная коллекция объектов, о которой говорит OP - person Novaterata; 01.06.2016
comment
Как бы вы эффективно и легко хранили, например, без универсальных диктовок Данные JSON, заполненные Dictionary / Hashtable: string-to- (int / string / bool / Dictionary / List)? Мне кажется очень глупым отказываться от неуниверсальных коллекций, когда в реальном мире большинство данных - по своей природе - нетипизированные, и нам нужны такие инструменты, как неуниверсальные C, чтобы помочь нам легко извлекать, анализировать, преобразовывать, проверять и т.д ... нет? - person Adam; 10.05.2017
comment
Что ж, прошло 10 лет, а неуниверсальные Коллекции все еще существуют, поэтому я бы сказал, что Microsoft заняла ту же позицию. Что касается принятых ответов, не-дженерики выжили дольше, чем Silverlight и Live Mesh! - person Nick Fisher; 10.11.2017
comment
Я не думаю, что это обоснование подтвердилось. - person StayOnTarget; 04.12.2018

Также есть проблемы с видимостью COM - взаимодействие COM нельзя использовать с универсальными шаблонами.

person Tony Lee    schedule 11.09.2008

В дальнейшем следует использовать только общие коллекции. Существует также преимущество предотвращения упаковки / распаковки типов в коллекции. Это неэффективно, особенно когда у вас есть коллекция типов значений, которые преобразуются в System.Object при сохранении в коллекции, следовательно, значения сохраняются в куче, а не в стеке вызовов.

person Sean Chambers    schedule 11.09.2008
comment
Упаковка / распаковка только применяется к типам значений. - person samjudson; 11.09.2008
comment
И универсальные шаблоны не могут использоваться с Com Interop. - person Tony Lee; 04.10.2008
comment
System.Collections.BitArray. Общий эквивалент? List<bool> по сравнению с этим может показаться ужасно неэффективным. - person Triynko; 23.12.2015

Что касается использования неуниверсальных коллекций для хранения разнородных коллекций материалов, вы всегда можете использовать List ‹object› для достижения той же цели. Только по этой причине я бы сказал, что почти нет причин снова прикасаться к неуниверсальным коллекциям.

Исключением из этого было бы обеспечение совместимости с системами, написанными на других языках, или с предыдущими версиями .NET framework, но, если вы спросите меня, это довольно "острый" случай.

person Mel    schedule 11.09.2008

Я могу сказать вам, что XAML-сериализация коллекций зависит от того, реализуют ли они либо IList, либо IDictionary, поэтому неуниверсальные коллекции будут с нами в течение некоторого времени.

person Community    schedule 11.09.2008

Я бы не стал говорить, что они устарели или будут удалены в ближайшее время. Это правда, что вам следует избегать использования неуниверсальных коллекций, если у вас нет причины не использовать универсальную версию. Тысячи строк устаревшего (не очень устаревшего) кода все еще существуют (и будут в течение многих лет), которые поддерживают неуниверсальные коллекции, такие как ArrayLists. Поскольку это были единственные коллекции в .NET 1.0 и 1.1, они широко использовались (и злоупотребляли) в течение года.

Мне все еще иногда приходится взаимодействовать со старым устройством отображения O / R, написанным на .NET 1.1, которое возвращает объекты IList. У меня есть метод, который выполняет преобразование в общий список ‹>, что неэффективно, но так оно и есть.

А если вам нужно хранить разные объекты в одном массиве (странно, но возможно), вам понадобится неуниверсальная коллекция. Штраф за бокс и распаковку - это то, что вам все равно придется заплатить.

Не бойтесь использовать их, если чувствуете, что должны.

person Martin Marconcini    schedule 11.09.2008
comment
‹Blockquote› А если вам нужно хранить разные объекты в одном массиве (странно, но возможно), вам понадобится не общая коллекция. ‹/Blockquote› Э, нет. создание агенерической коллекции, специализированной на Object, отлично работает. - person Joshua; 10.12.2008

Могут быть случаи, когда вам нужно хранить объекты неизвестных типов или объекты нескольких разных типов, но если вы действительно знаете тип объектов, которые хотите сохранить, я не вижу причины не использовать универсальную версию.

Изменить: как прокомментировано, вы можете просто использовать List<Object> - doh!

person samjudson    schedule 11.09.2008
comment
Если вам нужна эта функциональность, просто сделайте универсальный тип ‹Object›, чтобы получить старую функциональность. Постоянное использование дженериков проясняет ваши намерения. - person bradtgmurray; 11.09.2008

Да, насколько я понимаю, они существуют только для совместимости с существующими продуктами. Вы всегда должны использовать безопасную версию (т.е. использовать System.Collections.Generic вместо System.Collections).

http://msdn.microsoft.com/en-us/library/ms379564.aspx

person Mark Ingram    schedule 11.09.2008