List <T> .AddRange/InsertRange创建临时数组

CSh*_*pie 5 c#

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

T[] itemsToInsert = new T[count];
c.CopyTo(itemsToInsert, 0);
itemsToInsert.CopyTo(_items, index); 
Run Code Online (Sandbox Code Playgroud)

为什么要将它首先复制到"temp-array"(itemsToInsert)中,然后将temp数组复制到实际的_items-array中?这背后是否有任何原因,或者这只是复制ArrayList源码的剩余部分,因为同样的事情发生在那里.

usr*_*usr 4

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

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

将此与MemoryStream具有访问内部缓冲区的记录方法进行对比(并用它射击自己):GetBuffer()