什么是更好的方式来清除关注内存的数组

时间:2016-12-22 12:02:33

标签: c# arrays memory-management

****编辑*****

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

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

int length = arrayOfObj.Length

1: arrayOfObj = new Obj[length]

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

他们俩显然都在做同样的事情。 但就记忆而言,哪一个更好。 或者我应该留下内部垃圾收集的问题?

1 个答案:

答案 0 :(得分:4)

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

我还应该提到一些关于IDisposable的内容,正如你问题中的评论所暗示的那样。 .NET框架的垃圾收集器将在适当时释放托管的资源。 IDisposable接口的目的是保证释放非托管资源,例如打开文件和流。如果对象在数组中的类具有任何此类非托管资源,则该类应实现IDisposable,并且在清除阵列之前应在每个对象上调用Dispose

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

**请记住:如果您对这些对象有任何外部引用并且之后再次尝试使用它们,那么您将遇到麻烦,因为它们已经被处理掉了。