首页 文章

C#中的ArrayList与List <>

提问于
浏览
335

C#中 ArrayListList<> 有什么区别?

只是 List<> 有一个类型而 ArrayList 不是吗?

11 回答

  • -3

    是的,差不多 . List<T> 是一个通用类 . 它支持存储特定类型的值而无需转换为 object (当 TArrayList 情况下的值类型时,会产生装箱/拆箱开销) . ArrayList 只存储 object 引用 . 作为通用集合, List<T> 实现了通用 IEnumerable<T> 接口,可以在LINQ中轻松使用(无需任何 CastOfType 调用) .

    ArrayList 属于C#不赞成't have generics. It'的日子,赞成 List<T> . 您不应该在面向.NET> = 2.0的新代码中使用 ArrayList ,除非您必须与使用它的旧API进行交互 .

  • 23

    使用 List<T> 可以防止出现错误 . 避免运行时转换错误非常有用 .

    例:

    在这里(使用 ArrayList )您可以编译此代码,但稍后您将看到执行错误 .

    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
    }
    

    如果您使用 List ,则可以避免这些错误:

    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;
    }
    

    参考:MSDN

  • 16

    添加到上述几点 . 在64位操作系统中使用 ArrayList 比在32位操作系统中使用的内存少2倍 . 同时,通用列表 List<T> 将使用比 ArrayList 低很多的内存 .

    例如,如果我们在32位中使用19MB的 ArrayList ,则在64位中需要39MB . 但是如果你有一个32位的通用列表 List<int> 为8MB,那么64位只需要8.1MB,与ArrayList相比,它有481%的差异 .

    资料来源:ArrayList’s vs. generic List for primitive types and 64-bits

  • 453

    要添加的另一个区别是线程同步 .

    ArrayList通过Synchronized属性提供一些线程安全性,该属性返回集合周围的线程安全包装器 . 包装器通过在每次添加或删除操作时锁定整个集合来工作 . 因此,尝试访问集合的每个线程必须等待轮到一个锁 . 这不可扩展,可能会导致大型集合的性能显着下降 . List <T>不提供任何线程同步;用户代码必须在多个线程上同时添加或删除项目时提供所有同步 .

    更多信息在这里Thread Synchronization in the .Net Framework

  • -6

    简单的答案是,

    ArrayList是非泛型的

    • 它是一个对象类型,因此您可以将任何数据类型存储到其中 .

    • 您可以在ArrayList中存储任何值(值类型或引用类型),如string,int,employee和object . (注意和)

    • 拳击和拆箱将会发生 .

    • 不安全 .

    • 它比较旧了 .

    列表是通用的

    • 这是Type of Type,因此您可以在运行时指定T.

    • 您可以根据声明存储Type T(string或int或employee或object)的唯一值 . (注意或)

    • 拳击和拆箱不会发生 .

    • 类型安全 .

    • 这是更新的 .

    示例:

    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
    

    Please read the Microsoft official documenthttps://blogs.msdn.microsoft.com/kcwalina/2005/09/23/system-collections-vs-system-collection-generic-and-system-collections-objectmodel/

    enter image description here

    Note :在了解差异之前你应该先了解泛型:https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/

  • 4

    ArrayList 不是类型安全的,而 List<T> 是类型安全的 . 简单:) .

  • 1

    ArrayList 是不同类型数据的集合,而 List<> 是其自身的类型的相似类型的集合 .

  • 85

    我认为, ArrayListList<T> 之间的区别是:

    • List<T> ,其中T是值类型比 ArrayList 快 . 这是因为 List<T> 避免装箱/拆箱(其中T是值型) .

    • 许多消息来源说 - 通常 ArrayList 仅用于向后兼容 . (这不是真正的区别,但我认为这是重要的注意事项) .

    • 非通用的反射更容易 ArrayList 然后 List<T>

    • ArrayListIsSynchronized 属性 . 因此,很容易创建和使用同步 ArrayList . 我没找到 List<T>IsSynchronized 属性 . 另外请记住,这种类型的同步效率相对较低,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
    
    • ArrayList 具有 ArrayList.SyncRoot 属性,可用于同步(msdn) . List<T> 没有 SyncRoot 属性,因此在以下构造中,如果使用 List<T> ,则需要使用某个对象:
    ArrayList myCollection = new ArrayList();
    lock(myCollection.SyncRoot) //  ofcourse you can use another object for this goal
    {
        foreach (object item in myCollection)
        {
            // ...
        }
    }
    
  • 2

    使用“列表”可以防止出现错误 . 避免运行时转换错误非常有用 .

    例:

    在这里(使用ArrayList),您可以编译此代码但是稍后您会看到执行错误 .

    // 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.
            }
        }
    
  • 3

    对我来说,了解你的数据 . 如果我继续在效率的基础上扩展我的代码,我将不得不选择List选项作为解密我的数据的方式,而不是总是想知道类型的不必要的步骤,尤其是“自定义类型” . 如果机器了解差异并且可以确定我实际处理的是什么类型的数据,那么为什么我要阻止并且浪费时间通过“IF THEN ELSE”确定的回转?我的理念是让机器为我而不是我在机器上工作?了解不同目标代码命令的独特差异对于使代码高效有很长的路要走 .

    汤姆约翰逊(一次入境......一次出口)

  • -2

    这不仅仅是差异 . ArrayList成员可以像普通数组一样通过索引访问,并且ArrayList成员可以很容易地按直接和反向顺序排序,并且两个ArrayList可以很容易地合并,而简单List就不是这种情况 . 了解更多

    http://www.cirvirlab.com/index.php/c-sharp-code-examples/112-c-sharp-arraylist-example.html

相关问题