在查看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()
.