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

时间:2016-04-13 14:10:46

标签: c#

在查看List.AddRange的实现时,我发现了一些奇怪的东西我不明白。 Sourcecode, see line 727(AddRange调用InsertRange)

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

为什么要将它首先复制到“temp-array”(itemsToInsert)中,然后将temp数组复制到实际的_items-array中? 这背后有什么原因,或者这只是复制ArrayList源码的一些遗留问题,因为那里也会发生同样的事情。

1 个答案:

答案 0 :(得分:4)

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

有人可以传递一个精心设计的ICollection<T>来记住它传递的数组。现在,调用者可能会混淆List的内部数组,并开始依赖于List内部。

将此与MemoryStream进行对比,GetBuffer()具有访问内部缓冲区的文档化方法(并使用它进行拍摄):level