如果这是一个显而易见的问题,我很抱歉,但谷歌或搜索都没有让我得到答案.
有没有办法完全删除数组?
我想相反的int[] array = new int[5]
说你打电话:
void Foo(){ int[] a = new int[5]; }
在C#中,没有办法取消定义变量a
.这意味着即使您设置为null a
也将定义.但是,最终将超出范围.这意味着没有代码可以引用它,垃圾收集器将在下次运行时为您释放内存,这可能不会持续很长时间.Foo
a
Foo
a
你只需要让它超出范围,等待GC找到它; 这可能不会立即(事实上,它几乎肯定不会).如果在一个长期存在的对象上有一个字段(它将保留在范围内),那么您可以设置为null,这可以提供帮助.
您可以影响GC收集越早(不只是你的对象:一切符合条件的),但你应该很少,如果以往任何时候都做到这一点.我只在测试台上使用它; 但:
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); // DON'T DO THIS!!!
更多信息GC.Collect
:
使用GC.Collect()有什么不对?
何时可以调用GC.Collect?
没有必要删除数组,GC会处理它.
(非常)简单地说:
当内存不足时,垃圾收集器将启动,停止代码并遍历内存中的所有活动对象.
live表示堆栈上的一些引用,寄存器,静态引用和其他一些统称为"GC Roots"的东西.当它遍历它们时,它注意到它们还活着.
如果你的阵列不再存在,那么任何东西都无法再访问它(这就是决定活力的因素),因此它占用的内存将可以重用.
有可能是参考分配到空是否会持有引用比期望活得更长的一个原因,或者是抱着一大块,你需要立即内存,但是这很容易适得其反,实际上使该数组长寿.如果包含实例的寿命比它包含的数组长得多,那么实例而不是堆栈变量是这种优化的更好选择.
要明确的是,作为一个初学者,你不应该考虑这种事情,让GC做它的工作,只有在你做到时才尝试帮助它:
知道你需要
知道怎么
知道怎么检查你做对了
你应该阅读Chris Brumme关于这个主题的文章 ; 前几段应该解释一下情况.
任何人建议"将null赋给变量"都应特别注意以下部分:
即使您在使用它之后添加"aC = null;",JIT也可以自由地将此分配视为死代码并将其消除.