C# ArrayList源码剖析

本文探讨.NET Framework 4.6.1中ArrayList的源码,它作为动态数组,实现IList接口,支持动态扩容、便捷插入/删除及排序功能。详细解析Add、Remove、Sort等方法的实现,建议在预估容量下创建ArrayList以提高性能。
摘要由CSDN通过智能技术生成

源代码版本为 .NET Framework 4.6.1

本系列持续更新,敬请关注

有投入,有产出。

数组是C#中最基础的一种数据类型,一旦初始化之后,容量便已经确定。若想要动态扩充容量,那么集合可以满足这点需求。ArrayList是C#最常用也是最基础的一个动态数组。

ArrayList在System.Collections中,实现了IList接口(IList:表示可按照索引进行访问的非泛型集合对象)。

如此来,ArrayList可以干点什么事情呢?
1. 可以动态扩容;
2. 插入/删除 比较便捷;

为了防止废话过多而导致翻船,上代码:

  • ArrayList中的数据是由一个内部数组来进行维护的,一个私有的Object数据(Object 你就是万能的造物主啊~)
private Object[] _item[];
private int _size;//ArrayList的容量
private const int _defaultCapacity = 4;//默认的容量
private static readonly Object[] emptyArray = EmptyArray<Object>.Value; //默认的空数组

- 添加元素:Add(Object) ,AddRange(ICollection),Insert(Int32, Object),InsertRange(Int32, ICollection)。

  1. Add(Object):将对象添加到 ArrayList 的结尾处。
     public virtual int Add(Object value) {
            Contract.Ensures(Contract.Result<int>() >= 0);//后置契约,返回值必须大于等于0
            //动态扩容的核心方法,当ArrayList的容量等于内部存放数据的数组长度时,进行扩容
            if (_size == _items.Length) EnsureCapacity(_size + 1);
            _items[_size] = value;//在ArrayList末尾索引处写入值
            _version++;
            return _size++;//返回数组ArrayList的容量
        }
     //动态扩容的核心方法,一次扩容长度为初始容量的2倍,容量不得超出long的最大范围
     private void EnsureCapacity(int min) {
            if (_items.Length < min) {
                int newCapacity = _items.Length == 0 
                    ? _defaultCapacity: _items.Length * 2;
                //Array.MaxArrayLength为long的最大值
                if ((uint)newCapacity > Array.MaxArrayLength) 
                    newCapacity = Array.MaxArrayLength;
                if (newCapacity < min) newCapacity = min;

                Capacity = newCapacity;
            }
        }
     //自动扩容的实现原理是 创建一个更大容量新的组数,将原数组的数据搬至新组数
        public v
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值