Después de pasar a .NET 2.0+, ¿hay algún motivo para seguir usando los sistemas. Espacio de nombres de colecciones (además de mantener el código heredado)? ¿Debería usarse siempre el espacio de nombres de los genéricos?Generics and System.Collections
Respuesta
En su mayor parte, las colecciones genéricas funcionarán más rápido que las contrapartes no genéricas y le otorgan el beneficio de tener una colección fuertemente tipada. Al comparar las colecciones disponibles en System.Collections y System.Collections.Generic, se obtiene el siguiente "migración":
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 es inmutable (no hay miembros para cambiar el contenido de la colección), mientras que ICollection < T es > mudable. Esto hace que las interfaces sean similares en nombre solo mientras ICollection e IEnumerable <T> difieren en muy poco.
De esta lista, las únicas clases no genéricas que no tienen una contraparte genérica son BitArray y CaseInsensitiveComparer.
En algunas circunstancias, los contenedores genéricos funcionan mejor que los anteriores. Al menos deberían funcionar tan bien como los anteriores en todas las circunstancias. Y ayudan a detectar errores de programación. Es una rara combinación de una abstracción más útil y un mejor rendimiento, por lo que no hay muchas razones para evitarlos. Solo si te obligan a ir a una biblioteca defectuosa con la que tienes que trabajar, fue escrita antes de los genéricos.
Vi una entrevista con Anders Hejlsberg del equipo C# y se le preguntó si había algo que lamentara con las versiones anteriores de .net. No tener genéricos en asp.net 1.0 fue lo primero que mencionó. No tenerlo allí significaba que tenían que implementar soluciones temporales que se quedarían con las bibliotecas .net y pronto se convertirían en código heredado.
Nunca utilizo el espacio de nombres System.Collections y de su declaración esta parece ser la ruta correcta.
Lo único malo que puedo pensar cuando se utilizan los genéricos es la varianza, así por ejemplo, si tiene un List<Person>
y quiere pasarlo a un método que toma List<object>
puede no porque List<Person>
no puede convertirse a List<object>
directamente.
Este problema se resuelve en .NET 4.0.
- 1. JAXB Marshalling and Generics
- 2. C# Generics and Type Checking
- 3. Linq-to-entities, Generics and Precompiled Queries
- 4. System.Collections Vs System.Collections.ObjectModel
- 5. C# Generics
- 6. Java generics
- 7. Generics/JSON JavaScriptSerializer C#
- 8. C# Generics Instantiation
- 9. JAXB desmaquillar con java generics
- 10. System.Reflection vs Generics - performance
- 11. Generics type casting
- 12. C# Generics y Winform
- 13. Java Generics Curiosity
- 14. Java generics pasando parámetros
- 15. wcf exponing generics
- 16. Jackson JSON + Java Generics
- 17. EclipseLink @MappedSuperclass y generics
- 18. Generics y java.beans.Introspector
- 19. C# vs Java generics
- 20. Generics wildcard instanceiation
- 21. Java Generics (comodines)
- 22. C# Generics function
- 23. Java Generics circulares
- 24. (OrElse and Or) and (AndAlso and And) - ¿Cuándo usar?
- 25. Java Generics Sintaxis para matrices
- 26. WCF: Interfaces, Generics y ServiceKnownType
- 27. Delphi Generics> Diccionario con valor predeterminado
- 28. struct and class and inheritance (C++)
- 29. Java Generics comodines Con múltiples clases
- 30. Java Generics tipo conversión de rompecabezas
KeyedCollection es una alternativa adecuada a DictionaryBase, según los datos que estaba almacenando. –