2010-07-24 15 views
20

Recientemente hice una pregunta sobre SO que mencionó el posible uso de una ArrayList de C# para una solución. Se hizo un comentario de que usar un arraylist es malo. Me gustaría saber más sobre esto. Nunca antes había escuchado esta declaración sobre las listas de arreglos. podría ayudarme a ponerme al día sobre los posibles problemas de rendimiento con el uso de listas de arreglos¿Qué está mal con una lista de arreglos?

C#. .net-2

+2

Independientemente de los posibles problemas de rendimiento, no puedo pensar en una situación en la que usted prefiere un ArrayList más de un genérico ya 2.0. –

+0

Incluso si necesita una lista de objetos, puede usar List recursive

+5

@DOK - Los genéricos se introdujeron en .Net 2.0 – STW

Respuesta

36

El principal problema con ArrayList es que se usa object - significa que tiene que transmitir desde y hacia lo que está encapsulando. Es un remanente de los días anteriores a los genéricos y probablemente solo sea compatible con versiones anteriores.

No tiene el tipo de seguridad con ArrayList que tiene con una lista genérica. El problema de rendimiento radica en la necesidad de devolver los objetos al original (o tener un boxeo implícito).

El boxeo implícito ocurrirá cada vez que use un tipo de valor: se colocará en un recuadro cuando se coloque en el ArrayList y se desempaquetará cuando se haga referencia a él.

El problema no es solo el de rendimiento, sino también de la legibilidad y la exactitud. Desde que llegaron los genéricos, este objeto se ha vuelto obsoleto y solo se necesitaría en el código .NET 1.0/1.1.

+4

Tipo Seguridad también –

+0

@Russ Cam - gracias por el comentario. La respuesta se actualizó mientras comentaba;) – Oded

2

Además de los problemas de rendimiento, se trata de mover los errores del tiempo de ejecución para compilar el tiempo. Los objetos de conversión recuperados desde ArrayList s deben suceder en tiempo de ejecución y cualquier tipo de error ocurrirá durante la ejecución. Usando un List<> genérico, todos los tipos se verifican durante el tiempo de compilación.

+2

También es una cuestión de rendimiento ... –

+0

mejoras en el rendimiento a lo largo del tiempo usando List en lugar de ArrayList con entradas en él. – tster

+0

Esta no es una pregunta de rendimiento. Sin embargo, los problemas de rendimiento son parte de la respuesta. – AMissico

3

Se prefiere el genérico List<T> ya que es genérico, que proporciona información de tipo adicional y elimina la necesidad de agregar/unbox los tipos de valor agregados a él.

+0

@DOK - 'List ' existe en .net 2.0 – Lee

+0

@DOK, .NET 2.0 tiene genéricos. –

+0

¿Hay algún equivalente genérico al tipo de colección de vb.net, que permite que un iterador elimine el elemento actual (suponiendo que el contenido del elemento contiene información que identifica la clave)? El diccionario sería una buena combinación, excepto por el último punto. – supercat

3

ArrayList no es un tipo genérico, por lo que debe almacenar todos los elementos que coloque en él como objetos. Esto es malo por dos razones. Primero, al poner tipos de valor en ArrayList, fuerza al compilador a encajonar el tipo de valor en un tipo de referencia que puede ser costoso. En segundo lugar, ahora debes convertir todo lo que sacas de la lista de arreglos. Esto es malo ya que ahora necesita asegurarse de saber qué objetos hay allí.

La lista evita estos problemas ya que está construida con el tipo adecuado. Por ejemplo:

List<int> ints = new List<int>(); 
ints.Add(5); //no boxing 
int num = ints[0]; // no casting 
13

Si va a almacenar un tipo de valor (int, float, double, etc - o cualquier estructura), ArrayList hará que el boxeo en cada almacenamiento y unboxing en cada elemento de acceso. Esto puede ser un golpe significativo para el rendimiento.

Además, hay una completa falta de seguridad de tipo con ArrayList. Como todo está almacenado como "objeto", hay una carga adicional en usted, como desarrollador, para mantenerlo a salvo.

Además, si quiere el comportamiento de almacenar objetos, siempre puede usar List<object>. Esto no tiene ninguna desventaja sobre ArrayList, y tiene una gran ventaja (IMO): hace que su intención (almacenar un objeto sin tipo) sea clara desde el principio.

ArrayList realmente solo existe, y solo debe usarse, para el código .NET 1.1. Realmente no hay ninguna razón para usarlo en .NET 2+.

1

Todo el boxeo y el desembalaje pueden ser costosos y frágiles.Microsoft hizo algunas mejoras agradables en términos de tipeo y rendimiento en genéricos .NET 2.0.

Estas son algunas buenas lecturas:

Cuestiones relacionadas