如何在c#中删除数组?

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

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

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

说你打电话:

  void Foo(){ int[] a = new int[5]; } 

在C#中,没有办法取消定义变量a 。 这意味着即使您将a设置为null,也将在Foo定义。 然而,在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”的东西。 当它遍历它们时,它注意到它们还活着。

如果你的arrays不再存在,那么任何东西都无法再访问它(这就决定了活力),所以它占用的内存将可以重用。

可能有理由将引用分配为null,如果它将活动保持的时间超过所需的时间,或者它正在保存您需要的大块内存,但这很容易适得其反,实际上会使数组活得更长。 如果包含实例的寿命比它包含的数组长得多,那么实例而不是堆栈变量是这种优化的更好选择。

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

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

你应该阅读Chris Brumme关于这个主题的文章 ; 前几段应说明情况。

任何人建议“为变量赋值null”都应特别注意以下部分:

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

只是为了澄清如果你不理解其他答案中表达的一些术语,GC代表垃圾收集器。 像C#这样具有自动内存管理function的语言允许您专注于执行需要完成的操作,而不用担心您要创建的内容以及何时删除它。 GC通过定期遍历您创建的所有对象并查看它们是否对它们有任何引用来工作。 如果没有,这意味着你无法用它们做任何事情,所以它们也可能被删除,而系统就是这样做的。

有关详细信息,请参阅http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)

array = null,但我认为如果您阅读一些关于.NET内存管理模型以完全理解原因的话,那将是一个好主意。

你得到的最接近的是等待它超出范围或将其设置为null。

它不会立即删除或删除数组,但在删除对数组的所有引用后,垃圾收集器(GC)将及时删除它…

您可以在if(true){}语句中声明和初始化数组,在if语句之后(之后)数组变量不可访问,因此它将被删除。

在C ++中,可以使用delete关键字。 它最初在此评论和其他评论中提到过。 编辑历史显示了这一点。 即使其他人不理解为什么,这也是可行的(虽然是侧面答案)。 我这样说是因为如果他们理解多种语言,就可以用它来找到自己优雅的解决方案。

在.NET / MSIL中,您有delete关键字,但它名为variablename .Dispose()。 我提供这个是因为它删除了对变量的所有引用,并将其推送到垃圾收集的准备状态。 另一种选择是将变量设置为null ,因为它将变量保存为类型化对象,但释放它保存到垃圾收集的内容,以便稍后可以重新分配。

原始评论/答案:

C#的垃圾收集很棒,但是有时你真的需要从内存中删除一个变量并创建一个新实例,而程序的其他部分不会让它保持活动状态。 通过将数组指向新的内存块,可以将数组所拥有的现有内存块放入GC状态,例如:

 aMyArray = new int[]; 

然而,我可以用这种方式看到的主要问题是你真的不想浪费大量的内存,然后因为操作系统开始因为操作系统启动而导致一切都停止了。 考虑到C Sharp现在是一种主流语言并且在很多不同的应用程序中使用,包括编写游戏,我认为这是一个想法……如果C Sharp在这方面的行为与ActionScript / FLASH类似,那真是太好了。尊重。

在c ++中有delete关键字可以从内存中删除任何内容。 当然你也可以用它来删除数组,所以你可以在c ++中编写一个以数组作为参数的函数,在实现中你只需添加一行代码就可以立即删除它。 如果此函数属于类库项目中的类,则可以在C#中添加引用,使用命名空间创建实例并调用函数,或者如果函数声明为static,则不创建实例。

如果c ++中的项目类型不是类库,而只是一个dll文件,那么你应该导出声明的函数(extern“C”__ declspec(dllexport))并在c#中使用System.Runtime.InteropServices.DllImport使用它。当你使用它时dll import,重要的是你指定dll文件路径字符串,并在添加调用Convention = CallingConvention之后,如果你不希望每次调用导入的函数时都得到exception和问题。

您可以在互联网上阅读如何做到这一切。 希望这是一个好主意。

代码示例:

C ++ DLL项目:

 extern "C" __declspec( dllexport ) void Delete(array<__int32>^ arr) { delete arr; } 

C#项目:

 using System; using System.Runtime.InteropServices; namespace DeleteArray { class Program { [DllImport("...DeleteArray.dll", Convention=CallingConvention)] static extern void Delete(int[] arr); static int Main(string[] args) { int[] array = new int[] { 1, 2, 3, 4, 5 }; foreach (int integer in array) { Console.WriteLine(integer); } Delete(array); Console.Write(array[0]); //Runtime error! return 0; } } 

}

我在家里试过这个,它对我来说非常好,所以为什么不给别人呢!?

这可能已经解决但您可以将数组视为堆栈。 循环遍历它并在每次迭代时弹出顶部。

 while(true) { if(array.Length==0) { break; } array.Pop(); } 

这样,您可以将更多值推送到数组中,而无需重新实例化它