列表<T>。添加范围/插入范围创建临时数组



在查看List.AddRange的实现时,我发现了一些我不明白的奇怪东西。源代码,请参阅第 727 行(AddRange 调用 InsertRange(

T[] itemsToInsert = new T[count];
c.CopyTo(itemsToInsert, 0);
itemsToInsert.CopyTo(_items, index); 

为什么不先将集合复制到"临时数组"(itemsToInsert(中,然后将临时数组复制到实际的_items数组中?这背后有什么原因吗,或者这只是复制 ArrayList 源代码的一些遗留物,因为那里也发生了同样的事情。

我的猜测是,这是为了隐藏内部支持数组的存在。没有办法获取对该数组的引用,这是有意的。List类甚至不承诺有这样的数组。(当然,出于性能和兼容性原因,它将始终使用数组实现。

有人可以传入一个精心制作的ICollection<T>,该会记住它所传递的数组。现在,调用者可以弄乱内部List数组,并根据内部List开始。

与此形成对比的是MemoryStream,它有记录的访问内部缓冲区的方式(并用它射击自己(:GetBuffer() .

最新更新