如何有效地丢弃数组并用新值填充它
本文关键字:新值 填充 数组 有效地 | 更新日期: 2023-09-27 18:15:49
我在一个简单的WinForms游戏中使用了一些全局数组。数组在新游戏开始时初始化。当玩家处于游戏中间时(数组中充满了数据),他点击StartNewGame()按钮(重新启动游戏)。下一步该怎么做?
是否可以重新初始化整个数组为新游戏,或者我应该只是设置每个数组项为空,并使用已经初始化的数组(这会更慢)?
我的意思是这样做可以吗?
MyClass[,] gameObjects;
public Form1()
{
StartNewGame();
// game flow .. simplified here .. normally devided in functions and events..
StartNewGame();
// other game flow
}
public StartNewGame()
{
gameObjects = new MyClass[10,10];
// some work with gameObjects
}
这几乎完全取决于MyClass
,特别是它包含多少数据成员,它的构造函数(和成员的构造函数)需要多少处理,以及(重新)将该类的对象设置为"初始化"状态是否相对简单。通过对标可以得到更客观的答案。
从你的问题,我知道没有那么多的数组-在这种情况下,我会说,重新初始化整个数组
如果你有很多工作需要30秒来设置,也许你可以做清理,而不是重新初始化所有的东西。
如果你选择放置null,你可能会抛出一些丑陋的异常,所以我认为你应该清理数组内的对象,而不是将它们设置为null
如果示例中只有100个元素,那么应该不会有明显的性能影响。
如果你重新初始化数组,你将对n
对象执行n
构造。垃圾收集器将在稍后的某个时间清理旧数组并取消分配那些旧的n
对象。(所以你有n
预先分配,n
由GC释放)。
如果您将数组中的每个指针设置为null,垃圾收集器仍将执行相同数量的工作,并在稍后的时间清理这些n
对象。唯一的区别是这里没有对数组进行回收,但是这一次的回收可以忽略不计。
valid bit
来标记对象是否有效(在使用中),要重新初始化,只需将所有valid bits
设置为false。以类似的方式,程序不会在不使用内存时遍历并将0写入所有内存。他们只是把它当作垃圾,并在必要时覆盖数据。
但是,如果您的对象数量没有达到数千个,我想说您真的不会注意到性能的影响。
gameObjects = new MyClass[10,10];
…是要走的路。这肯定比循环遍历数组并将项设置为null要快。它也更容易编码和理解。但无论如何,这两种变体都非常快,除非您有数千万个条目!"[10,10]"非常小,所以忘掉表现,做对你来说更合适、更容易理解的事情。在大多数情况下,干净的代码比性能更重要。