2008-09-11 15 views
23

En otras palabras:¿Las colecciones no genéricas en .NET están obsoletas?

¿Hay una buena razón para elegir una colección de tipo flexible en lugar de una de tipo seguro (HashTable vs. Dictionary)? ¿Siguen ahí solo por compatibilidad?

Por lo que tengo entendido, las colecciones genéricas no solo son seguras para el tipo, sino que su rendimiento es mejor.


Aquí está un artículo completo sobre el tema: An Extensive Examination of Data Structures Using C# 2.0.

Respuesta

21

Las colecciones no genéricas son tan obsoletos que han sido retirados de la CoreCLR utilizado en Silverlight y Live Mesh.

+0

¿Qué hay de System.Collections.BitArray? Realmente no tiene un equivalente genérico. – Triynko

+0

@Triynko un BitArray es una colección con establecimiento inflexible de booleanos con usos especiales, no una colección vagamente escrito muy abstracta de objetos como el PO está hablando de – Novaterata

+0

Sin dicts no genéricos, ¿cómo de manera eficiente y fácil almacenar, por ejemplo, Datos JSON, que están llenos de Dictionary/Hashtable: string-to- (int/string/bool/Dictionary/List)? Me parece muy tonto descartar colecciones no genéricas, cuando en el mundo real la mayoría de los datos son, por naturaleza, no tipados, y necesitamos herramientas como C no genéricas para ayudarnos a captar, analizar, convertir y verificar fácilmente , etc ... no? – Adam

1

Puede haber casos en los que necesite almacenar objetos de tipos desconocidos u objetos de múltiples tipos diferentes, pero si realmente conoce el tipo de objetos que desea almacenar, entonces no veo motivo para no usarlos la versión genérica

Editar: Como comentado solo puede usar List<Object> - doh!

+1

Si necesita esta funcionalidad, simplemente haga el genérico de tipo para obtener la funcionalidad anterior. Usar siempre genéricos aclara tus intenciones. – bradtgmurray

15

En adelante solo se deben utilizar colecciones genéricas. También existe el beneficio de evitar el boxeo/unboxing de tipos en la colección. Esto es ineficaz, especialmente cuando tiene una colección de tipos de valores que se convierten a System.Object cuando se almacenan en la colección, por lo tanto, almacena los valores en el montón en lugar de la pila de llamadas.

+2

El boxeo/unboxing _only_ se aplica a los tipos de valores. – samjudson

+0

Y los genéricos no se pueden usar con Com Interop. –

+0

'System.Collections.BitArray'. ¿Equivalente genérico? 'List ' parece terriblemente ineficiente en el espacio en comparación. – Triynko

7

Con respecto al uso de colecciones no genéricas para almacenar colecciones heterogéneas de cosas, siempre puede usar el objeto de la lista < para lograr lo mismo. Por esta sola razón, diría que casi no hay razón para tocar las colecciones no genéricas nunca más.

La excepción a esto sería mantener la compatibilidad con sistemas escritos en otros lenguajes, o en versiones anteriores de .NET framework, pero ese es un caso bastante "nervioso" si me preguntas.

1

No me gustaría saltar y decir que están obsoletos o van a ser eliminados en el corto plazo. Es cierto que usted debe evitar el uso de colecciones no genéricas a menos que tenga una razón no no utiliza una versión genérica. Miles de líneas de código heredado (no tan legado) todavía están flotando (y lo estarán durante años) que admiten colecciones no genéricas como ArrayLists. Dado que estas fueron las colecciones únicas en .NET 1.0 y 1.1, se ha utilizado ampliamente (y se ha abusado) durante todo el año.

Todavía de vez en cuando tengo que interactuar con un antiguo asignador O/R escrito en .NET 1.1 que devuelve objetos IList. Tengo un método que hace la conversión a una lista genérica <>, que no es eficiente, pero así son las cosas.

Y si necesita almacenar diferentes objetos en la misma matriz (raro pero posible) usted necesita una colección no genérica. La penalización de Boxeo y Unboxing es algo que tendrás que pagar de todos modos.

No tenga miedo de usarlos si usted siente que es necesario.

+1

Y si necesita almacenar diferentes objetos en la misma matriz (raro pero posible) necesitará una colección no genérica.
Uh, no. crear una colección ageneric especializada para Object funciona bien. – Joshua

2

te puedo decir que XAML serialización de las colecciones se basan en la aplicación de ellas, ya sea IList o IDictionary, por lo que las colecciones no genéricas van a estar con nosotros por algún tiempo.

16

También hay problemas con la visibilidad COM - interoperabilidad COM no se puede utilizar con los genéricos

Cuestiones relacionadas