generic .net generics collections

generic - ¿Las colecciones no genéricas en.NET están obsoletas?



list generic c# (8)

Dicho de otra manera:

¿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 yo entiendo, las colecciones genéricas no solo son seguras para el tipo, sino que su rendimiento es mejor.

Aquí hay un artículo completo sobre el tema: Un examen exhaustivo de las estructuras de datos con C # 2.0 .


Con respecto al uso de colecciones no genéricas para almacenar colecciones heterogéneas de cosas, siempre puede usar List <object> 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 del .NET framework, pero ese es un caso bastante "nervioso" si me preguntas.


En el futuro solo se deben usar 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.


Las colecciones no genéricas son tan obsoletas que han sido eliminadas del CoreCLR utilizado en Silverlight y Live Mesh.


No me gustaría saltar y decir que están obsoletos o van a ser eliminados en el corto plazo. Es cierto que debe evitar el uso de colecciones no genéricas a menos que tenga una razón para no utilizar 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 únicas colecciones en .NET 1.0 y 1.1, han sido ampliamente utilizadas (y abusadas) durante todo el año.

Todavía de vez en cuando tengo que interactuar con un antiguo mapeador 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) , necesitará una colección no genérica. La penalización de Boxeo y Unboxing es algo que tendrás que pagar de todos modos.

No tengas miedo de usarlos si crees que tienes que hacerlo.


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 los objetos que desea almacenar, entonces no veo motivo para no usar la versión genérica.

Editar: Como se comentó, puedes usar List<Object> - doh!


Puedo decirles que la serialización XAML de las colecciones depende de que implementen IList o IDictionary, por lo que las colecciones no genéricas nos acompañarán durante algún tiempo.


Sí, por lo que yo entiendo, solo están ahí para la compatibilidad con los productos existentes. Siempre debe usar la versión segura tipo (es decir, use System.Collections.Generic sobre System.Collections).

http://msdn.microsoft.com/en-us/library/ms379564.aspx


También hay problemas con la visibilidad COM: la interoperabilidad COM no se puede usar con genéricos