讲讲C#ArrayList的原理,为啥不推荐用?

原理

     Array数组是包含n个相同类型的变量,这些变量可以通过索引来访问,在内存中保存的是连续的空间,一但声明变量长度是不可更改的。

int[] array = new int[10];//长度固定,超出长度读取会报错。

    ArrayList 你解决array数组不可变的问题,本质上是对array的封装,可以动态改变数组的,他还有添加删除功能,也能通过索引访问,使用比较灵活,它在不变的情况下内存空间是连续的,但是在不同时刻不能期待他不能在同一块内存。.

 //这是开源的arrylist构造代码片段,里面new了个object数组
     public ArrayList(ICollection c)
        {
            ArgumentNullException.ThrowIfNull(c);
            int count = c.Count;
            if (count == 0)
            {
                _items = Array.Empty<object>();
            }
            else
            {
                _items = new object[count];
                AddRange(c);
            }
        }
 //感兴趣可以看看源码:
 // https://github.com/dotnet/runtime/blob/215b39abf947da7a40b0cb137eab4bceb24ad3e3/src/libraries/System.Private.CoreLib/src/System/Collections/ArrayList.cs

为啥不推荐使用?

    由于声明后默认是包含若干个object,可以添加任何类型, 由于类型可以不同,在使用的时频繁的装箱拆箱,不建议使用,如果长度可控,建议使用下标数组,以提高性能。

    另外在.NET 2.0微软推出泛型,主要解决固定类型问题,类型固定的用List,而arrayList不固定,List兼容了arrayList添加删除等功能,完美的替代了ArrayList,并且不存在拆箱装箱的问题。

 List<T> a=new List<T>(); //List中的T是指定的类型,不存在同一变量下

什么时候合适用ArrayList呢?

      当List<Object>可以用ArrayList,List<Object>运行时泛型不存在,List<Object>原理上是不等于ArrayList的。