如何在c#中删除数组?

Pat*_*und 24 c# arrays

如果这是一个显而易见的问题,我很抱歉,但谷歌或搜索都没有让我得到答案.

有没有办法完全删除数组?

我想相反int[] array = new int[5]

Ros*_*ant 41

说你打电话:

 void Foo(){
     int[] a = new int[5];
 }
Run Code Online (Sandbox Code Playgroud)

在C#中,没有办法取消定义变量a.这意味着即使您设置为null a也将定义.但是,最终将超出范围.这意味着没有代码可以引用它,垃圾收集器将在下次运行时为您释放内存,这可能不会持续很长时间.FooaFoo a

  • 一定要喜欢明确的答案:)感谢一大堆让我从谷歌搜索更长时间. (3认同)

Mar*_*ell 17

你只需要让它超出范围,等待GC找到它; 这可能不会立即(事实上,它几乎肯定不会).如果在一个长期存在的对象上有一个字段(它将保留在范围内),那么您可以设置为null,这可以提供帮助.

您可以影响GC收集越早(不只是你的对象:一切符合条件的),但你应该很少,如果以往任何时候都做到这一点.我只在测试台上使用它; 但:

GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); // DON'T DO THIS!!!
Run Code Online (Sandbox Code Playgroud)

更多信息GC.Collect:


Shu*_*oUk 5

没有必要删除数组,GC会处理它.

(非常)简单地说:

当内存不足时,垃圾收集器将启动,停止代码并遍历内存中的所有活动对象.
live表示堆栈上的一些引用,寄存器,静态引用和其他一些统称为"GC Roots"的东西.当它遍历它们时,它注意到它们还活着.

如果你的阵列不再存在,那么任何东西都无法再访问它(这就是决定活力的因素),因此它占用的内存将可以重用.

可能是参考分配到空是否会持有引用比期望活得更长的一个原因,或者是抱着一大块,你需要立即内存,但是这很容易适得其反,实际上使该数组长寿.如果包含实例的寿命比它包含的数组长得多,那么实例而不是堆栈变量是这种优化的更好选择.

要明确的是,作为一个初学者,你不应该考虑这种事情,让GC做它的工作,只有在你做到时才尝试帮助它:

  1. 知道你需要
  2. 知道怎么
  3. 知道怎么检查你做对了


Gre*_*ech 5

你应该阅读Chris Brumme关于这个主题的文章 ; 前几段应该解释一下情况.

任何人建议"将null赋给变量"都应特别注意以下部分:

即使您在使用它之后添加"aC = null;",JIT也可以自由地将此分配视为死代码并将其消除.