List Clear()方法会摧毁子元素吗?[C#.NET]

5
如果我创建一个递归的列表:
class myList
{
  List<myList> childLists;
  List<string> things;

  //...
}

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

然后稍后调用tempList.Clear(),它会销毁所有的childLists吗?还是我应该创建一个递归方法来先清除所有的childLists?

4个回答

10

如果没有任何其他引用指向子列表,它们将像正常一样被垃圾回收。关键是要注意任何悬挂的子项引用(特别是数据绑定在完成后往往不容易被发现)。


4

您似乎有C++的背景。

阅读.NET垃圾回收应该能解决很多问题。

在您的情况下,您不需要“销毁”所有子列表。实际上,在正常的.NET最佳实践方式中,您甚至不能自己销毁或处理通用List对象。如果您不再希望使用它,则只需删除对它的所有引用。当垃圾收集器(也称为GC)认为适当时,对象的实际销毁将由其完成。

GC也非常聪明,它会检测到循环引用和a->b->c->d对象树以及您可以想出的大多数内容,并正确清除整个对象图。因此,您不需要创建递归清理例程。

但请注意,GC的行为是不确定的,即您不会知道实际的“清理”何时发生,因此,如果您的列表包含一些应立即释放的重要资源,例如文件句柄、数据库连接,则应显式地“处理”它,如@lassevk所推荐的那样。


1

您不需要清除子列表。

唯一需要做的是,如果列表中的对象实现了IDisposable接口,则在清除列表之前应迭代这些对象并调用.Dispose()方法。


只有在确定列表中没有其他引用项时才执行此操作,否则其他代码可能会尝试使用已释放的对象。 - Blair Conrad


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接