如果这是一个显而易见的问题,我很抱歉,但无论是谷歌还是在这里搜索都没有得到答案。
是否有一种方法可以完全删除一个数组?
我想要相反的效果:删除 int[] array = new int[5]
如果这是一个显而易见的问题,我很抱歉,但无论是谷歌还是在这里搜索都没有得到答案。
是否有一种方法可以完全删除一个数组?
我想要相反的效果:删除 int[] array = new int[5]
假设你调用了:
void Foo(){
int[] a = new int[5];
}
在C#中,无法取消定义变量a
的方式。这意味着即使将a
设置为null,在Foo
中仍将定义a
。
但是,在Foo
结束时,a
将超出范围。这意味着没有代码可以引用它,并且垃圾回收器会在下一次运行时自动释放内存,这可能需要很长时间。
您只需要让它超出范围,并等待GC找到它;这可能不会立即发生(实际上,几乎肯定不会)。如果您有一个长期存在的对象上的字段(将保持在范围内),那么可以将其设置为null,这可能有所帮助。
您可以影响GC更早地进行收集(不仅是您的对象:所有符合条件的对象),但您应该很少甚至从不这样做。我只在测试环境中使用它;但:
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); // DON'T DO THIS!!!
更多关于GC.Collect
的信息:
您应该阅读Chris Brumme关于这个主题的文章;前几段应该解释了情况。
任何建议“将变量赋值为null”的人都应该特别注意其中所说的:
即使在使用后添加“aC = null;”,JIT也可以将此赋值视为死代码并将其消除。
数组为null,但我认为如果您了解.NET内存管理模型,就可以充分理解为什么这样做是一个好主意。
如果你不理解其他回答中提到的术语,GC是垃圾收集器的缩写。像C#这样具有自动内存管理功能的语言可以让你专注于完成任务,而不必担心你正在创建什么以及何时删除它。GC会定期浏览你创建的所有对象,并查看它们是否有任何引用。如果没有,这意味着你无法对它们做任何事情,因此最好将它们删除,系统也确实这样做了。
更多详情,请参见http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)。
最接近的方法就是等待它超出作用域或将其设置为null。
它不会立即删除数组,但在您放弃对数组的所有引用后,垃圾收集器(GC)将及时删除它...
aMyArray = new int[];
然而,我发现这种方式的主要问题是,您真的不希望浪费大量内存,然后在操作系统发疯启动垃圾收集器时一切都停滞不前。考虑到C#现在是一种主流语言,并且被广泛用于各种应用程序,包括编写游戏... 如果C#在这方面不像ActionScript/FLASH那样,那将是非常好的。