Неуниверсальные коллекции в .NET устарели? - PullRequest
25 голосов
/ 11 сентября 2008

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

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

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


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

Ответы [ 8 ]

21 голосов
/ 11 сентября 2008

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

17 голосов
/ 11 сентября 2008

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

15 голосов
/ 11 сентября 2008

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

7 голосов
/ 11 сентября 2008

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

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

2 голосов
/ 11 сентября 2008

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

1 голос
/ 11 сентября 2008

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

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

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

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

1 голос
/ 11 сентября 2008

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

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

0 голосов
/ 11 сентября 2008

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

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

...