c#中如何删除一个数组?如果这是一个明显的问题,我很抱歉,但无论是谷歌还是搜索都没有让我找到答案。有没有办法完全删除数组?我想要相反的int[]array=newint[5]假设你调用:voidFoo(){int[]a=newint[5];在C#中,无法取消定义变量a。这意味着即使你将a设置为null,它也会被定义在Foo处。但是,在Foo的末尾,a将超出范围。这意味着没有代码可以引用它,垃圾收集器将在下次运行时为您释放内存,这可能不会持续很长时间。您只需要让它超出范围并等待GC找到它即可;这可能不会立即(事实上,几乎肯定不会)。如果您在长期存在的对象(将保留在范围内)上有一个字段,您可以设置为null,这会有所帮助。您可以更快地影响GC收集(不仅仅是您的对象:所有符合条件的对象),但您应该很少这样做。我只在测试台上使用它;但是:GC.Collect(GC.MaxGeneration,GCCollectionMode.Forced);//不要这样做!!!更多关于GC.Collect:不需要删除数组,GC会处理它。用(非常)简单的术语来说:当内存不足时,垃圾收集器启动,停止代码并遍历内存中的所有活动对象。live是指堆栈上的一些引用、寄存器、静态引用和其他一些统称为“GCRoots”的东西。当它遍历它们时,它注意到它们还活着。如果你的数组不再存在,那么就没有任何东西可以访问它了(这决定了活性),所以它占用的内存将是可重用的。如果null保持它的存活时间比需要的时间长,或者它持有您需要的内存块,则可能有理由将引用分配给null,但这很容易适得其反,实际上会使数组的寿命更长。如果包含实例的寿命比它包含的数组长得多,则实例而不是堆栈变量是此优化的更好选择。需要明确的是,作为初学者,你不应该考虑这种事情,让GC做它的工作,并且只有在你这样做时才试图帮助它:知道你需要什么知道如何知道如何检查你正确地做事,您应该阅读ChrisBrumme关于该主题的文章;前几段应该说明情况。任何人建议“给一个变量赋值null”,都应该特别注意以下部分:即使你添加了“aC=null;”在使用它之后,JIT可以自由地将这个分配视为死代码并消除它。如果您不理解其他答案中表达的某些术语,请澄清一下,GC代表垃圾收集器。像C#这样具有自动内存管理的语言可以让您专注于做需要做的事情,而不用担心您正在创建什么以及何时删除它。GC的工作方式是定期遍历您创建的所有对象并查看它们是否有任何对它们的引用。如果不是,则意味着您不能对它们做任何事情,所以它们还不如删除,这就是系统所做的。有关详细信息,请参阅http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)array=null,但我认为如果您阅读一些有关.NET内存管理模型的内容以充分理解为什么会这样,那将会很好。您最接近的是等待它超出范围或将其设置为空。它不会立即删除或删除数组,而是在删除所有对数组的引用后,垃圾收集器(GC)会及时删除它...您可以在if(true){}中声明和初始化数组语句,在if语句之后(Afterwards)数组变量不可访问,因此将被删除。在C++中,您可以使用delete关键字。它最初是在这篇评论和其他评论中提到的。编辑历史显示了这一点。即使其他人不明白为什么,这也有效(虽然是一个旁白)。我这样说是因为如果他们了解多种语言,他们可以使用它来找到自己的优雅解决方案。在.NET/MSIL中,您有delete关键字,但它被命名为variablename.Dispose()。我提供这个是因为它删除了对变量的所有引用并将其推送到垃圾收集的就绪状态。另一种选择是将变量设置为null,因为它将变量作为类型化对象保存,但将其保存的内容释放到垃圾回收中,以便以后可以重新分配。原始评论/答案:C#的垃圾收集功能很棒,但有时您确实需要从内存中删除一个变量并创建一个新实例,而程序的其他部分不会使其保持活动状态。通过将数组指向新的内存块,可以将数组拥有的现有内存块置于GC状态,例如:aMyArray=newint[];但是,我可以通过这种方式看到的主要问题是,您真的不想浪费大量内存,然后一切都停止了,因为操作系统启动了,因为操作系统启动了。考虑到CSharp现在是一种主流语言并用于许多不同的应用程序,包括编写游戏,我认为这是一个想法......如果CSharp在这方面表现类似于ActionScript/FLASH就好了。尊重。在C++中,有delete关键字可以从内存中删除任何内容。当然你也可以用它来删除数组,所以你可以用c++写一个函数,把一个数组作为参数,在实现中只需要加一行代码就可以立即删除。如果此函数属于类库项目中的类,则可以在C#中添加引用,使用命名空间创建实例并调用该函数,或者如果函数声明为静态则不创建实例。如果c++中的项目类型不是类库,而只是一个dll文件,那么你应该导出声明的函数(extern"C"__declspec(dllexport))并在c#中使用System.Runtime.InteropServices.DllImport。当你使用dllimport时,重要的是你指定了dll文件路径字符串,并且在添加callingConvention=CallingConvention之后,如果你不想每次调用import函数时都出现异常和问题。您可以在互联网上阅读如何完成这一切。希望这是个好主意。代码示例:C++DLL项目:extern"C"__declspec(dllexport)voidDelete(array^arr){deletearr;C#项目:使用系统;使用System.Runtime.InteropServices;namespaceDeleteArray{classProgram{[DllImport("...DeleteArray.dll",Convention=CallingConvention)]staticexternvoidDelete(int[]arr);staticintMain(string[]args){int[]array=newint[]{1,2,3,4,5};foreach(数组中的整数整数){Console.WriteLine(整数);}删除(数组);Console.Write(数组[0]);//运行时错误!返回0;我在家里试过这个,对我来说效果很好,所以为什么不把它给别人呢!?这可能已经解决了,但您可以将数组视为堆栈。遍历它并在每次迭代时弹出顶部。while(true){if(array.Length==0){中断;}array.Pop();}这样,你就可以把更多的值压入数组而不用重新实例化它上面是C#学习教程:如何在c#中删除一个数组?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
