微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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)中,您可以选择:您是否希望使用可增长的“类似数组的东西”或不可增长的东西?那里有一个权衡,这些语言选择不为你做出决定.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐