После перехода на .NET 2.0+ существует ли когда-либо причина использования пространства имен systems.Collections (помимо сохранения устаревшего кода)? Следует ли вместо этого использовать пространство имен generics?Generics and System.Collections
ответ
По большей части общие коллекции будут выполняться быстрее, чем не общий вариант, и дают вам возможность иметь строго типизированную коллекцию. Сравнивая коллекции, доступные в 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.
В некоторых случаях общие контейнеры работают лучше, чем старые. По крайней мере, они должны выполнять, как и старые, при любых обстоятельствах. И они помогают уловить ошибки программирования. Это редкое сочетание более полезной абстракции и лучшей производительности, поэтому нет причин для их устранения. Только если вы вынуждены с помощью crummy библиотеки вы должны работать с тем, что было написано до дженериков.
Я видел интервью с Андерсом Хейлсбергом из команды C#, и его спросили, есть ли что-то, о чем он сожалел о предыдущих выпусках .net. Первое, что он упомянул, не имел дженериков в asp.net 1.0. Не имея этого, это означало, что они должны были применять обходные пути, которые будут использовать библиотеки .net и вскоре станут устаревшим кодом.
Я никогда не использую пространство имен System.Collections, и из его утверждения это, кажется, правильный путь.
О только плохая вещь я могу думать при использовании дженериков дисперсии, так, например, если у вас есть List<Person>
, и вы хотите, чтобы передать его в метод, который принимает List<object>
вы не можете, потому что List<Person>
не может быть приведен к List<object>
напрямую.
Эта проблема решена в .NET 4.0.
- 1. Generics and Factory
- 2. Checkstyle and Generics
- 3. C# Casting and Generics
- 4. Jackson and Generics
- 5. Generics and instanceof - java
- 6. F # casting and generics
- 7. C# Generics and Reflection
- 8. Generics and TreeSets
- 9. Generics and Parameterized Constructors
- 10. Java generics and "..."
- 11. Generics and unchecked cast
- 12. Generics and User Controls
- 13. Java Generics and reflection!
- 14. Java generics and streams
- 15. Generics and Implementing IComparable
- 16. Generics and java.beans.Introspector
- 17. JAXB Marshalling and Generics
- 18. Swift generics and enum and boxing
- 19. java 6 ArrayLists and Arrays and Generics
- 20. Java Abstract, Generics, and Builders
- 21. Java, Gson, Lists and Generics
- 22. Java Generics and exetends Сопоставимый
- 23. Scala Data Modeling and Generics
- 24. java factory methods and generics
- 25. Java Generics and unchecked cast
- 26. Java Generics and Map declaration
- 27. UML Class Diagram and Generics
- 28. C#: Generics, Polymorphism and Specialization
- 29. C# Generics and Inheritance Problem
- 30. System.Collections.Generic vs System.Collections?
KeyedCollection является подходящей альтернативой DictionaryBase, в зависимости от данных, которые вы храните. –
2009-06-09 21:25:00