c# – 为什么不能在循环中向数组中添加项?
为什么在C#中你不能将对象添加到数组中,除非你声明数组的长度或直接添加项目?例如,我不能简单地这样做
foreach(object item in array) { array.Add(item) } 我必须创建一个列表并在循环后将其转换为数组. 我不想知道该怎么做,我想对WHY数组是固定长度的逻辑探索,但其他集合不是(List,ListArray) 解决方法
数组不可调整大小,因为这就是内存的工作原理.了解内存分配如何在.NET中完全正常工作对于SO答案来说有点多了,如果你愿意,你可以在别处阅读所有相关内容,但是一个方面基本上是在每个平台上都是通用的:当你为某些东西分配一块内存时,之后的下一个地址可能是其他东西的一部分.
因此,你不能只是扩展一块内存并希望没有出错,你必须测试你可以扩展它并有一个计划B,当你不能 – 该计划B将分配一个新的块内存,将旧东西复制到其中,并释放旧块. 为了避免多次重新分配和复制,通常的做法是将新块的大小设置为旧块的两倍,因此如果添加n个项目,则只需重新分配和复制O(log n)次,保持amortized time for adding a new item to a dynamically-grown array down to O(1).因此保持不变时间,伟大 – 不是真的.现在还有更多的时间,而不是你不必重新分配,事实上即使每一个不会导致增长的添加都有一点开销,以确保不需要增长. 因此,不增长的数组更简单,更快,浪费更少的内存.因此,在C#(以及许多其他语言,例如Java和C)中,您可以选择:您是否希望使用可增长的“类似数组的东西”或不可增长的东西?那里有一个权衡,这些语言选择不为你做出决定. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |