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

StackOverflow https://stackoverflow.com/questions/56375

  •  09-06-2019
  •  | 
  •  

Вопрос

Скажем иначе:

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

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


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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top