2008-11-30 16 views
8

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

12

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.

+0

KeyedCollection es una alternativa adecuada a DictionaryBase, según los datos que estaba almacenando. –

0

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.

0

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.

0

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.