ArrayList vs Lista<> en C#
¿Cuál es la diferencia entre ArrayList
y List<>
en C#?
¿Es sólo que List<>
tiene un tipo mientras ArrayList
que no?
Sí, más o menos. List<T>
es una clase genérica. Admite el almacenamiento de valores de un tipo específico sin convertir hacia o desde object
(lo que habría incurrido en gastos generales de boxeo/unboxing cuando T
es un tipo de valor en el ArrayList
caso). ArrayList
simplemente almacena object
referencias. Como colección genérica, List<T>
implementa la IEnumerable<T>
interfaz genérica y se puede utilizar fácilmente en LINQ (sin necesidad de ninguna Cast
llamada OfType
).
ArrayList
Pertenece a los días en que C# no tenía genéricos. Está en desuso a favor de List<T>
. No debe usarlo ArrayList
en código nuevo dirigido a .NET >= 2.0 a menos que tenga que interactuar con una API antigua que lo use.
Usarlo List<T>
puede evitar errores de transmisión. Es muy útil para evitar un error de conversión en tiempo de ejecución .
Ejemplo:
Aquí (usando ArrayList
) puede compilar este código, pero verá un error de ejecución más adelante.
ArrayList array1 = new ArrayList();
array1.Add(1);
array1.Add("Pony"); //No error at compile process
int total = 0;
foreach (int num in array1)
{
total += num; //-->Runtime Error
}
Si usas List
, evitas estos errores:
List<int> list1 = new List<int>();
list1.Add(1);
//list1.Add("Pony"); //<-- Error at compile process
int total = 0;
foreach (int num in list1 )
{
total += num;
}
Referencia: MSDN
Para añadir a los puntos anteriores. El uso ArrayList
en un sistema operativo de 64 bits requiere el doble de memoria que el uso en un sistema operativo de 32 bits. Mientras tanto, la lista genérica List<T>
utilizará mucha menos memoria que la lista ArrayList
.
por ejemplo si utilizamos una ArrayList
de 19MB en 32 bits se necesitarían 39MB en 64 bits. Pero si tiene una lista genérica List<int>
de 8 MB en 32 bits, solo necesitaría 8,1 MB en 64 bits, lo que supone una enorme diferencia del 481 % en comparación con ArrayList.
Fuente: Lista de ArrayList versus lista genérica para tipos primitivos y 64 bits
Otra diferencia a agregar es con respecto a la sincronización de subprocesos.
ArrayList
proporciona cierta seguridad para subprocesos a través de la propiedad Sincronizada, que devuelve un contenedor seguro para subprocesos alrededor de la colección. El contenedor funciona bloqueando toda la colección en cada operación de agregar o eliminar. Por lo tanto, cada hilo que intenta acceder a la colección debe esperar su turno para tomar el candado. Esto no es escalable y puede provocar una degradación significativa del rendimiento en colecciones grandes.
List<T>
no proporciona ninguna sincronización de subprocesos; El código de usuario debe proporcionar toda la sincronización cuando se agregan o eliminan elementos en varios subprocesos al mismo tiempo.
Más información aquí Sincronización de subprocesos en .Net Framework
La respuesta simple es,
ArrayList no es genérico
- Es un tipo de objeto, por lo que puedes almacenar cualquier tipo de datos en él.
- Puede almacenar cualquier valor (tipo de valor o tipo de referencia), como cadena, int, empleado y objeto en ArrayList. (Nota y)
- Se realizarán boxeo y unboxing.
- No es seguro escribir.
- Es mayor.
La lista es genérica
- Es un tipo de tipo, por lo que puede especificar la T en tiempo de ejecución.
- Puede almacenar un único valor de tipo T (cadena o int o empleado u objeto) según la declaración. (Nota o)
- El boxeo y el unboxing no sucederán.
- Escriba seguro.
- Es más nuevo.
Ejemplo:
ArrayList arrayList = new ArrayList();
List<int> list = new List<int>();
arrayList.Add(1);
arrayList.Add("String");
arrayList.Add(new object());
list.Add(1);
list.Add("String"); // Compile-time Error
list.Add(new object()); // Compile-time Error
Lea el documento oficial de Microsoft : https://blogs.msdn.microsoft.com/kcwalina/2005/09/23/system-collections-vs-system-collection-generic-and-system-collections-objectmodel/
Nota : debe conocer los genéricos antes de comprender la diferencia: https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/