2008-11-30 3 views
8

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

ответ

12

По большей части общие коллекции будут выполняться быстрее, чем не общий вариант, и дают вам возможность иметь строго типизированную коллекцию. Сравнивая коллекции, доступные в 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 <T> является изменчивый. Это делает интерфейсы похожими только на имя, тогда как ICollection и IEnumerable <T> отличаются очень мало.

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

+0

KeyedCollection является подходящей альтернативой DictionaryBase, в зависимости от данных, которые вы храните. – 2009-06-09 21:25:00

0

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

0

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

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

0

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

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