ArrayList vs Lista<> en C#

Resuelto scatman asked hace 14 años • 12 respuestas

¿Cuál es la diferencia entre ArrayListy List<>en C#?

¿Es sólo que List<>tiene un tipo mientras ArrayListque no?

scatman avatar Feb 22 '10 15:02 scatman
Aceptado

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 Tes un tipo de valor en el ArrayListcaso). ArrayListsimplemente almacena objectreferencias. 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 Castllamada OfType).

ArrayListPertenece a los días en que C# no tenía genéricos. Está en desuso a favor de List<T>. No debe usarlo ArrayListen código nuevo dirigido a .NET >= 2.0 a menos que tenga que interactuar con una API antigua que lo use.

Mehrdad Afshari avatar Feb 22 '2010 08:02 Mehrdad Afshari

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

termas avatar Oct 22 '2012 10:10 termas

Para añadir a los puntos anteriores. El uso ArrayListen 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 ArrayListde 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

Anoop avatar Oct 24 '2013 09:10 Anoop

Otra diferencia a agregar es con respecto a la sincronización de subprocesos.

ArrayListproporciona 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

NullReference avatar Nov 12 '2015 12:11 NullReference

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/

ingrese la descripción de la imagen aquí

Nota : debe conocer los genéricos antes de comprender la diferencia: https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/

Aravin avatar Jun 07 '2018 08:06 Aravin