c# – 为什么不能在循环中向数组中添加项?

c# – 为什么不能在循环中向数组中添加项?,第1张

概述为什么在C#中你不能将对象添加到数组中,除非你声明数组的长度或直接添加项目?例如,我不能简单地这样做 foreach(object item in array){ array.Add(item)} 我必须创建一个列表并在循环后将其转换为数组. 我不想知道该怎么做,我想对WHY数组是固定长度的逻辑探索,但其他集合不是(List,ListArray) 数组不可调整大小,因为这就是内存的工作原 为什么在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)中,您可以选择:您是否希望使用可增长的“类似数组的东西”或不可增长的东西?那里有一个权衡,这些语言选择不为你做出决定.

总结

以上是内存溢出为你收集整理的c# – 为什么不能在循环中向数组中添加项?全部内容,希望文章能够帮你解决c# – 为什么不能在循环中向数组中添加项?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1226144.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存