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

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

InformationsquelleAutor scatman | 2010-02-22

11 Comentarios

  1. 506

    Sí, bastante. List<T> es una clase genérica. Es compatible con el almacenamiento de valores de un tipo específico sin conversión a o desde object (que habría incurrido boxing/unboxing sobrecarga cuando T es un tipo de valor en el ArrayList caso). ArrayList simplemente almacena object referencias. Como una colección genérica, List<T> implementa el genérico IEnumerable<T> interfaz y puede ser utilizado fácilmente en LINQ (sin necesidad de Cast o OfType llamada).

    ArrayList pertenece a los días que C# no tiene genéricos. Es despreciado en favor de List<T>. Usted no debe usar ArrayList en el nuevo código al que se dirige .NET >= 2.0 a menos que usted tiene una interfaz con un viejo API que utiliza.

    • ¿Te importaría explicar por qué se usa «boxeo» y no «casting»? Lo de boxeo que pasa aquí? Son objetos asignados/desasignado?
    • Estás en lo correcto que la conversión sería más general. Dicho esto, la diferencia real en el tiempo de ejecución es cuando usted está tratando con tipos de valor (que es lo que supuse que cuando escribí «el boxeo»). Para los tipos de referencia, el comportamiento es el mismo que ArrayList en tiempo de ejecución. Estáticamente, sin embargo, va a necesitar un molde con ArrayList.
    • Me preguntaba si marco debe restringir el T de «objeto» de tipo, desde ArrayList implícitamente permite que.
    • Respecto a la depreciación del tipo de las colecciones, vea Genéricos Considera Perjudicial
    • que blog fue escrito hace casi 15 años. Creo que la evidencia en la última década + ha demostrado que los medicamentos genéricos no son perjudiciales. 🙂
  2. 97

    Utilizando List<T> puede evitar errores de conversión. Es muy útil para evitar un tiempo de ejecución error de conversión.

    Ejemplo:

    Aquí (usando ArrayList) puede compilar este código, pero usted va a ver un error de ejecución posterior.

    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 utiliza List, a evitar 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;
    }

    De referencia:
    MSDN

    • Usted puede verificar el tipo cuando se tire de la ArrayList para evitar errores de conversión. Hoy en día la gente usa el objeto, haciendo ArrayList ya no es necesario.
    • i +1 a la justificación, pero usted todavía puede hacer si(num es de tipo int y){} a tu lista de matriz para evitar errores
    • Evitar errores de conversión y de boxeo de sobrecarga. Bastante los motivos por los medicamentos genéricos en general.
  3. 23

    Para agregar a los puntos anteriores. El uso de ArrayList en 64 bits del sistema operativo toma 2x memoria de uso en el de 32 bits del sistema operativo. Mientras tanto, la lista genérica List<T> consumen mucha memoria baja de la ArrayList.

    por ejemplo si usamos un ArrayList de 19MB en 32 bits tomaría 39 MB en la versión de 64 bits. Pero si usted tiene una lista genérica List<int> de 8MB en 32 bits tomaría sólo 8.1 MB en la versión de 64-bit, que es una convulsa 481% de diferencia cuando se compara con ArrayList.

    Fuente: ArrayList versus Lista genérica de los tipos primitivos y de 64 bits

    • que sólo es cierto para el almacenamiento de los tipos de valor, no los tipos de referencia. la diferencia se debe al hecho de que un arraylist sólo puede contener punteros, y los datos deben ser almacenados en otro lugar. Por otro lado, los tipos de valor que pueden ser almacenados directamente en una lista.
  4. 18

    Otra diferencia es añadir con respecto a la Sincronización de subprocesos.

    ArrayList proporciona un hilo de seguridad a través de la Sincronizado de la propiedad, que devuelve un hilo de seguridad envoltura alrededor de la colección. El contenedor funciona mediante el bloqueo de la colección entera en cada agregar o quitar de la operación. Por lo tanto, cada hilo que está intentando acceder a la colección debe esperar su turno para tomar la cerradura. Esto no es escalable y puede causar una degradación significativa de rendimiento para grandes colecciones.

    List<T> no proporciona ninguna sincronización de subprocesos; el código de usuario debe proporcionar la sincronización cuando los elementos se agregan o eliminan en varios hilos al mismo tiempo.

    Más info aquí Sincronización de subprocesos en el .Net Framework

    • No estoy diciendo que usted debe utilizar ArrayList, si se puede evitar, pero esto es una tontería razón. El contenedor es totalmente opcional, después de todo, si usted no necesita el bloqueo o si necesita un control más granular, no utilice el contenedor.
    • Si desea hilo de seguridad, sugiero mirar el Sistema.Las colecciones.Concurrente espacio de nombres antes de considerar ArrayList.
  5. 8

    Respuesta es Simple,

    ArrayList No es Genérico

    • Es un Tipo de Objeto, así que usted puede almacenar cualquier tipo de datos en ella.
    • Usted puede almacenar cualquier valor (tipo de valor o tipo de referencia) tales string, int, del empleado y del objeto en el ArrayList. (Nota e)
    • Boxing y Unboxing va a suceder.
    • No tipo de seguro.
    • Es mayor.

    Lista es Genérica

    • Es un Tipo de texto, de modo que usted puede especificar la T en tiempo de ejecución.
    • Puede almacenar un único valor de Tipo T (cadena o int o un empleado o de un objeto) basado en la declaración. (Nota o)
    • Boxing y Unboxing no va a suceder.
    • Tipo de seguro.
    • Es más reciente.

    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

    Por favor, lea el oficial de Microsoft documento: https://blogs.msdn.microsoft.com/kcwalina/2005/09/23/system-collections-vs-system-collection-generic-and-system-collections-objectmodel/

    ArrayList vs Lista de<> en C#

    Nota: Usted debe saber que los Genéricos antes de entender la diferencia: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/

  6. 4

    ArrayList es a las colecciones de los diferentes tipos de datos, mientras que List<> es la colección de tipo similar a la de su propio depedencties.

  7. 1

    Creo, las diferencias entre ArrayList y List<T> son:

    1. List<T>, donde T es el tipo de valor es más rápido que ArrayList. Este es
      porque List<T> evita boxing/unboxing (donde T es el tipo de valor).
    2. Muchas fuentes dicen – generalmente ArrayList usado simplemente para mantener la
      la compatibilidad. (no es una diferencia real, pero creo que es
      nota importante).
    3. Reflexión es más fácil con no genérico ArrayList luego List<T>
    4. ArrayList ha IsSynchronized de la propiedad. Así, es fácil
      para crear y utilizar sincronizado ArrayList. Yo didin no se encontró IsSynchronized propiedad para List<T>. También tenga en mente que este tipo de sincronización es relativamente ineficiente, msdn):

      var arraylist = new ArrayList();
      var arrayListSyncronized = ArrayList.Synchronized(arraylist
      Console.WriteLine($"syncronized {arraylist.IsSynchronized}");
      Console.WriteLine($"syncronized {arrayListSyncronized.IsSynchronized}");
      
      var list = new List<object>();
      var listSyncronized = ArrayList.Synchronized(list);
      Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
      Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
    5. ArrayList ha ArrayList.SyncRoot propiedad que puede ser utilizada para syncronisation (msdn). List<T> no ha SyncRoot de la propiedad, por lo que en
      la siguiente construcción es necesario utilizar algún objeto si utiliza List<T>:

      ArrayList myCollection = new ArrayList();
      lock(myCollection.SyncRoot) // ofcourse you can use another object for this goal
      {
          foreach (object item in myCollection)
          {
              //...
          }
      }
  8. -1

    Como se menciona en el .NET Framework documentación

    No recomendamos que utilice la ArrayList clase para los nuevos
    desarrollo. En su lugar, le recomendamos que use el genérico List<T>
    clase. El ArrayList clase está diseñada para mantener heterogéneos
    colecciones de objetos. Sin embargo, no siempre ofrece la mejor
    rendimiento. En su lugar, recomendamos lo siguiente:

    • Para una heterogénea colección de objetos, el uso de la List<Object> (en C#) o List(Of Object) (en Visual Basic) de tipo.
    • Para una homogénea colección de objetos, el uso de la List<T> clase.

    Ver también No colecciones genéricas no debe ser utilizado

    ArrayList vs Lista de<> en C#

  9. -2

    El uso de «Lista» puede evitar errores de conversión. Es muy útil para evitar un tiempo de ejecución error de conversión.

    Ejemplo:

    Aquí (usando ArrayList) puede compilar este código, pero usted va a ver un error de ejecución posterior.

        //Create a new ArrayList
    
    
        System.Collections.ArrayList mixedList = new System.Collections.ArrayList();
    
    
        //Add some numbers to the list
        mixedList.Add(7);
        mixedList.Add(21);
    
    
        //Add some strings to the list
        mixedList.Add("Hello");
        mixedList.Add("This is going to be a problem");
    
    
    
    
        System.Collections.ArrayList intList = new System.Collections.ArrayList();
        System.Collections.ArrayList strList = new System.Collections.ArrayList();
    
    
        foreach (object obj in mixedList)
        {
            if (obj.GetType().Equals(typeof(int)))
            {
                intList.Add(obj);
            }
            else if (obj.GetType().Equals(typeof(string)))
            {
                strList.Add(obj);
            }
            else
            {
                //error.
            }
        }
    • Lo que hace este complemento más allá de la respuesta termas dio tres años antes? Tiene casi el mismo texto literal, sin vinculación a la fuente, sin tener que formatear correctamente, etc.
  10. -3

    Para mí todo es cuestión de saber sus datos. Si sigo a ampliar mi código en la base de la eficiencia, tendría que elegir la opción de Lista como una manera de descifrar los datos de mi w/o el paso innecesario de siempre preguntando acerca de los tipos, especialmente Personalizados de Tipos». Si la máquina entiende la diferencia y se puede determinar en qué tipo de datos de que en realidad estoy tratando con entonces ¿por qué debo obtener en el camino y perder tiempo yendo a través de los giros de ‘IF then ELSE’ determinaciones? Mi filosofía es dejar que la máquina funcione para mí en lugar de mi trabajo en la máquina? Conocer las diferencias particulares de los diferentes objetos de código de comandos va un largo camino en la elaboración de su código como eficiente.

    Tom Johnson
    (Uno De Entrada … Otro De Salida)

Dejar respuesta

Please enter your comment!
Please enter your name here