2009-01-30 6 views

Respuesta

4

La lista genérica le da impulso de rendimiento.

Ver esta pregunta:

Do C# Generics Have a Perfomance Benefit?

Presupuesto de MSDN:

Es a su ventaja de utilizar la implementación tipo específico de la Lista < (De < (T>)>) clase en lugar de usando la clase ArrayList o escribiendo fuertemente mecanografió la colección del envoltorio usted mismo. La razón es que su aplicación debe hacer lo que hace el .NET Framework para usted ya, y el tiempo de ejecución de lenguaje común puede compartir Microsoft código de lenguaje intermedio y los metadatos, que su aplicación no puede.

1

La lista no es segura para subprocesos y no está destinada a ser expuesta. Puede utilizar una Colección (De T) en su lugar (tenga en cuenta que esto es diferente de CollectionBase), o simplemente exponer IList (Of T) o IEnumerable (Of T).

0

La herencia de Collection (Of T) está recomendada por Microsoft. No se garantiza que la API List (Of T) siga siendo la misma de una versión a otra. Entonces, si usa List (Of T) en sus interfaces públicas, su código se puede romper cuando se ejecuta en nuevas versiones de CLR.

Krzysztof Cwalina, uno de los diseñadores del BCL, tiene esto que decir acerca de lista <T>:

¿Por qué no se recomienda el uso de Lista <T> en API públicas

Nosotros No recomiendo usar la Lista <T> en API públicas por dos razones.

  • Lista <T> no está diseñado para ser ampliado. es decir, no puede anular ningún miembro. Esto significa, por ejemplo, que un objeto que devuelve la lista <T> de una propiedad no podrá recibir notificaciones cuando se modifique la colección. La colección <T> le permite anular el miembro protegido de SetItem para recibir "notificaciones" cuando se agregan nuevos elementos o se cambia un elemento existente.
  • Lista <T> tiene muchos miembros que no son relevantes en muchos escenarios. Decimos que la lista <T> está demasiado "ocupada" para los modelos de objetos públicos. Imagine la propiedad ListView.Items que devuelve la lista <T> con toda su riqueza. Ahora, mira el ListView real.Artículos devueltos tipo; es mucho más simple y similar a la Colección <T> o ReadOnlyCollection <T>.

Source

+0

¿Puede proporcionar un enlace a esta recomendación de EM? Dudo que cualquiera de las clases base pueda cambiarse en futuras versiones de FW. – aku

+0

También CLR no afecta BCL, entonces ¿cómo puede afectar la Lista ? – aku

+0

MS tiene un historial de salir de su camino para mantener la compatibilidad entre versiones. Tengo que pensar que un cambio radical en la Lista (De T) es muy poco probable. – ScottS

1

una lista genérica <> ha sido diseñado para la velocidad y el uso interno. La colección genérica <> por otro lado, ha sido diseñada para ser extensible.

Una de las ventajas de la clase Collection <> es que puede anular algunos métodos diferentes (ClearItems(), InsertItem(), RemoveItem() y SetItem()). El tipo genérico Lista <>, por otro lado, no proporciona ningún método que pueda ser anulado.

¿Por qué es esto importante? Digamos, por ejemplo, que los requisitos futuros obligan a plantear un evento ItemAdded cuando se agrega un elemento a la colección. Si utilizó el tipo List <>, no tiene muchas opciones. Sin embargo, si hubiera utilizado la clase Collection <>, tiene la posibilidad de exponer un nuevo evento ItemAdded y anular el método InsertItem() para que se eleve el evento ItemAdded cuando se agrega un elemento.

1

El tipo de fundición cuesta tiempo, y se evita cuando se utilizan genéricos. Si usa List (Of T) no se necesita ningún tipo de conversión, porque será una colección de caracteres fuertes. Si usa ArrayList, está realizando un fundido desde Object a su propio tipo y viceversa, lo que genera una sobrecarga adicional.

Además de eso, previene problemas de conversión de tipos que no puede detectar en tiempo de compilación. (Por ejemplo, agregar un int en una lista de matriz que debe contener cadenas no es un problema cuando se usa una lista de arreglos, pero puede causar una excepción no válida cuando no se espera una int en tiempo de ejecución. Usar listas genéricas o colecciones evita esto porque el código no se compilará.)

Espero que esto ayude.

Cuestiones relacionadas