在查看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源码的一些遗留问题,因为那里也会发生同样的事情。
答案 0 :(得分:4)
我的猜测是,这是为了隐藏内部支持数组的存在。没有办法获得有意的那个数组的引用。 List
类甚至不承诺存在这样的数组。 (当然,出于性能和兼容性原因,它将始终使用数组实现。)
有人可以传递一个精心设计的ICollection<T>
来记住它传递的数组。现在,调用者可能会混淆List
的内部数组,并开始依赖于List
内部。
将此与MemoryStream
进行对比,GetBuffer()
具有访问内部缓冲区的文档化方法(并使用它进行拍摄):level
。