【问题标题】:What will be better way to clear Array in concern of Memory有什么更好的方法来清除与内存有关的数组
【发布时间】:2016-12-22 12:02:32
【问题描述】:

**** 编辑 *****

有个问题-here,我已经解决了。我的提问目的不同(在那个问题中,提问者正在寻求他得到的解决方案。在这里我正在寻找更好的方法来完成任务(我知道两种解决方案,并要求更好的一个甚至更好的第三个)选项))


我有一个 Obj 数组。 我知道这两种清除(或类似)数组的方法。

int length = arrayOfObj.Length

1: arrayOfObj = new Obj[length]

2: Array.Clear(arrayOfObj, 0, length)

他们显然都在做同样的事情。 但是就内存而言,其中哪一个更好。 还是我应该离开内部垃圾收集的事情?

【问题讨论】:

  • 把它留给 GC,只要它们不实现 IDisposable 在这种情况下你应该处理每个元素。
  • 另外,如果实现了IDisposable,则使用using 块来管理处置。
  • @HimBromBeere 所以如果我让Obj 实现IDisposable 我可以做哪些优化?我应该遍历数组并处理每个对象吗?和出于好奇(与这个问题无关),处置对象更好或使用using (Obj) {}
  • 当您的实例实现IDisposable 时,您必须以任何方式调用Dispoase,否则会产生内存泄漏。但我建议使用using (var instance = new ...),即使出现异常,它也会自动调用Dispose

标签: c# arrays memory-management


【解决方案1】:

您不必担心。正如您所建议的,垃圾收集将为您处理它。但是,如果您仍然在其他地方引用了数组中的任何对象,那么这些对象当然不会被垃圾回收。

我还应该根据您的问题的 cmets 的建议提及 IDisposable 的一些内容。 .NET 框架的垃圾收集器将在适当时释放托管资源。 IDisposable 接口的目的是保证释放非托管资源,例如打开的文件和流。如果对象在您的数组中的类有任何此类非托管资源,则该类应实现IDisposable,并且您应在清除数组之前对每个对象调用Dispose

通常在处理IDisposable 时,您会使用using 语句来保证在您处理完对象后正确处理它。但是,由于在这种情况下您正在处理一次性对象的 collection,因此不太可能在 using 语句中创建每个对象(在某些奢侈的场景中可能会这样)。因此,在清除数组**之前,您必须遍历元素并在每个元素上调用Dispose。同样,仅当您的集合中的对象具有在每个对象被垃圾回收之前需要处理的非托管资源时。

** 请记住:如果您对任何这些对象有外部引用并在之后再次尝试使用它们,因为它们已经被释放,您将会遇到麻烦。

【讨论】:

  • The Joy of CLRHow I Learned to Stop Worrying and Love Managed Code
  • @Equalsk CLR 确实是“炸弹”;)
  • @rory.ap 是的,我明白了。谢谢你。顺便说一句,使用 Dispose 有什么额外的好处吗? (见问题的 cmets)
  • @AmitMaheshwari -- 我正在努力。查看我的更新。
  • @rory.ap 这就是我要找的。将其标记为答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-11-08
  • 2014-12-18
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 1970-01-01
  • 2014-06-03
相关资源
最近更新 更多