List Clear()方法是否销毁子[C#.NET]?

List Clear()方法是否销毁子[C#.NET]?,c#,.net,memory-management,recursion,C#,.net,Memory Management,Recursion,如果创建列表的递归列表: class myList { List<myList> childLists; List<string> things; //... } List<myList> tempList = new List<myList>(); 类myList { 列出儿童名单; 列出事情; //... } 列表模板列表=新建列表(); 然后调用templast.Clear(),它是否会销毁内存中的所有子列表,或者我是否应

如果创建列表的递归列表:

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

  //...
}

List<myList> tempList = new List<myList>();
类myList
{
列出儿童名单;
列出事情;
//...
}
列表模板列表=新建列表();

然后调用templast.Clear(),它是否会销毁内存中的所有子列表,或者我是否应该创建一个递归方法来首先清除所有子列表?

如果不存在对子列表的其他引用,它们将按正常方式进行垃圾收集。诀窍是观察对子项的任何悬空引用(数据绑定尤其容易在完成后不被注意)。

您不需要清除子列表


<>你唯一要做的是,如果列表中的对象实现IDISPISPOLIDE,那么在清除列表之前,你应该迭代对象并调用.Debug()方法。

< P>你似乎来自C++背景。 读一读应该会让你明白很多事情

在您的情况下,您不需要“销毁”所有子列表。事实上,您甚至不能以正常的良好实践.NET方式销毁或处置通用列表对象。如果您不想再使用它,那么只需删除对它的所有引用即可。当垃圾收集器(也称为GC)认为合适时,对象的实际销毁将由它完成

GC也是非常智能的,它会检测循环引用和a->b->c->d对象树,以及大多数你能找到的东西,并正确地清理整个对象图。因此,您不需要创建递归清理例程


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

您可以将列表对象设置为null!
选中

仅当您确定列表中的项目没有其他引用时才执行此操作,否则,其他代码可能会尝试使用已处置的对象