Generics and System.Collections - PullRequest
       15

Generics and System.Collections

8 голосов
/ 30 ноября 2008

После перехода на .NET 2.0+ есть ли причина по-прежнему использовать пространство имен systems.Collections (помимо поддержки устаревшего кода)? Должно ли вместо этого всегда использоваться пространство имен generics?

Ответы [ 4 ]

12 голосов
/ 30 ноября 2008

По большей части универсальные коллекции будут работать быстрее, чем неуниверсальные аналоги, и у вас будет преимущество иметь строго типизированную коллекцию. Сравнивая коллекции, доступные в System.Collections и System.Collections.Generic, вы получаете следующую «миграцию»:

    Non-Generic               Generic Equivalent
    ------------------------------------------------------------
    ArrayList                 List<T>
    BitArray                  N/A
    CaseInsensitiveComparer   N/A
    CollectionBase            Collection<T>
    Comparer                  Comparer<T>
    DictionaryBase            Dictionary<TKey,TValue>
    Hashtable                 Dictionary<TKey,TValue>
    Queue                     Queue<T>
    ReadOnlyCollectionBase    ReadOnlyCollection<T>
    SortedList                SortedList<TKey,TValue>
    Stack                     Stack<T>

    DictionaryEntry           KeyValuePair<TKey,TValue>

    ICollection               N/A (use IEnumerable<T> or anything that extends it)
    IComparer                 IComparer<T>
    IDictionary               IDictionary<TKey,TValue>
    IEnumerable               IEnumerable<T>
    IEnumerator               IEnumerator<T>
    IEqualityComparer         IEqualityComparer<T>
    IList                     IList<T>

ICollection является неизменяемой (нет членов для изменения содержимого коллекции), в то время как ICollection является изменяемой. Это делает интерфейсы похожими только по названию, в то время как ICollection и IEnumerable отличаются очень мало.

Из этого списка единственными неуниверсальными классами, которые не имеют универсального аналога, являются BitArray и CaseInsensitiveComparer.

0 голосов
/ 30 ноября 2008

О единственной плохой вещи, которую я могу вспомнить при использовании Generics - это дисперсия, так что, например, если у вас есть List<Person> и вы хотите передать его методу, который принимает List<object>, вы не можете, потому что List<Person> нельзя напрямую привести к List<object>.

Эта проблема решена в .NET 4.0.

0 голосов
/ 30 ноября 2008

Я видел интервью с Андерсом Хейлсбергом из команды c #, и его спросили, не сожалеет ли он о предыдущих выпусках .net. Отсутствие дженериков в asp.net 1.0 было первым, что он упомянул. Отсутствие там означало, что они должны были реализовать обходные пути, которые придерживались бы библиотек .net и скоро становились устаревшим кодом.

Я никогда не использую пространство имен System.Collections, и по его утверждению это правильный путь.

0 голосов
/ 30 ноября 2008

В некоторых случаях универсальные контейнеры работают лучше, чем старые. Они должны по крайней мере работать так же, как старые при любых обстоятельствах. И они помогают отлавливать ошибки программирования. Это редкое сочетание более полезной абстракции и лучшей производительности, поэтому нет особой причины избегать их. Только если вас подстерегает отвратительная библиотека, вам придется работать с тем, что было написано до генериков.

...