做百度手机网站点击,泗阳住房建设局网站,计算机网络技术就业方向网站开发,龙岗门户“当你提出疑问并开始思考时#xff0c;答案就离你不远了”图片#xff1a;奥森公园的向日葵 拍摄于2022年7月23日 摄影师#xff1a;刘先生01—问题缘起严格来说应该是ListT#xff0c;因为.NET的核心基础类库中#xff0c;并没有List#xff0c;作为泛型类型的…“当你提出疑问并开始思考时答案就离你不远了”图片奥森公园的向日葵 拍摄于2022年7月23日 摄影师刘先生01—问题缘起严格来说应该是ListT因为.NET的核心基础类库中并没有List作为泛型类型的ListT对应的非泛型类型是ArrayList。那么小伙伴们是否清楚ListT是哪种数据结构呢List被称作“列表”相信大家对于队列和链表都很熟悉但是列表似乎有些陌生课本教材中将广义表称为列表这个广义表的定义是一个多层次的数据结构。直白的说就是表中的元素类型可以不同这显然不是.NET中ListT。微软文档的定义是ListT 表示可通过索引访问的对象的强类型列表。这显然也没有解答我们问题。程序世界没有秘密一切答案都藏在代码里。扒出ListT的源码我们一起看一下吧。【文末附源码】02—初识ListListT的源码如下从源码及注释中可知ListT是基于数组实现的可扩容的列表。看一下这几个私有变量 T[] _items是实际的存储类型默认构造函数将_items赋值为一个空数组。int _size记录当前列表中的元素数量。int _version这个有意思我们知道在遍历列表过程中不能对列表进行修改这个功能便是通过_version实现的当列表中的元素修改后_version值会改变列表遍历过程中对其进行判断进而引发异常中断操作。03—List如何扩容那列表是如何实现数组长度变化的呢下面3个方法给了我们答案。从源码可知私有变量_size记录了列表中实际的元素数量当调用Add(T item)添加元素时会将_size与_item.Length进行对比判断当前数组是否已满首次添加元素时分配的数组默认长度为4否则重新分配一个2倍长度的数组然后将原先的元素拷贝到新数组中实现数组的自动扩容。04—List使用小技巧1.在已知数据长度的情况下初始化时应指定初始长度。以添加100个元素为例全部Add(T item)进列表需要6次数组扩容和数据拷贝显然在已知数据的长度的情况下应该在创建List对象时指定初始长度以减少数组的重写分配和数据拷贝。2.另一种扩容方法是设置Capacity属性但需要注意设置的值不能小于当前列表的元素数量否则会抛异常。3.在.NET 6中新增了一个方法public int EnsureCapacity(int capacity)推荐调用这个方法进行列表扩容只要参数capacity不小于0方法就不会报错。05—总结结论ListT是以数组为底层数据结构实现的可扩容的列表并且提供了查找转换排序遍历顺序逆转等便捷的方法。ListT中既有Count属性又有Count()方法小伙伴们知道为什么吗我们下期再聊。说明文中源码基于.NET 6.0版本在整理文章内容的过程中还参考对比了.NET Framework 4.8 、.NET 5.0 几个不同版本的代码不同版本间略有异。文档参考ListT文档地址 源码链接ListT源码地址喜欢的朋友可以点赞转发加关注