List Clear()方法是否会破坏子项[C#.NET]?

时间:2008-11-10 18:12:50

标签: c# .net memory-management recursion

如果我创建一个列表的递归列表:

class myList
{
  List<myList> childLists;
  List<string> things;

  //...
}

List<myList> tempList = new List<myList>();

然后调用tempList.Clear(),它会破坏内存中的所有childLists,还是应该创建一个递归方法来首先清除所有的childLists?

4 个答案:

答案 0 :(得分:9)

如果子列表中不存在其他引用,则它们将正常进行垃圾回收。诀窍是要注意对子项的任何悬空引用(数据绑定特别容易在注意后被忽略)。

答案 1 :(得分:4)

您似乎来自C ++背景。

阅读.NET's Garbage Collection应该清除很多事情。

在您的情况下,您不需要“销毁”所有子列表。实际上,您甚至无法以正常的良好实践.NET方式自行销毁或处置通用List对象。如果您不再希望使用它,那么只需删除对它的所有引用。当对象看起来合适时,对象的实际销毁将由垃圾收集器(也就是GC)完成。

GC也非常智能,它会检测圆形参考和a-&gt; b-&gt; c-&gt; d对象树和大多数事情你可以提出并正确清理整个对象图。所以你不需要创建那个递归清理程序。

但请注意GC的行为是不确定的,即你不知道什么时候会发生实际的“清理”,所以如果你的列表包含一些应该立即释放的重要资源,即文件句柄,数据库连接,那么你应该明确地“处理”它,正如@lassevk推荐的那样。

答案 2 :(得分:1)

您无需清除子列表。

您唯一需要做的就是如果列表中的对象实现了IDisposable,那么您应该遍历这些对象并在清除列表之前调用.Dispose()方法。

答案 3 :(得分:0)