Являются ли не общие коллекции в .NET устаревшими?

Поставить иначе:

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

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


Вот обширная статья по теме: Обширная проверка структур данных с использованием С# 2.0.

Ответ 1

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

Ответ 7

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

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

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

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

Ответ 8

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

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