如果我创建列表的递归列表:
class myList
{
List<myList> childLists;
List<string> things;
//...
}
List<myList> tempList = new List<myList>();
然后稍后调用 tempList.Clear(),它会破坏内存中的所有 childList,还是我应该创建一个递归方法先清除所有 childList?
如果我创建列表的递归列表:
class myList
{
List<myList> childLists;
List<string> things;
//...
}
List<myList> tempList = new List<myList>();
然后稍后调用 tempList.Clear(),它会破坏内存中的所有 childList,还是我应该创建一个递归方法先清除所有 childList?
如果不存在对子列表的其他引用,它们将像往常一样被垃圾收集。诀窍是注意对子项的任何悬空引用(数据绑定尤其容易在完成后被忽视)。
您似乎来自 C++ 背景。
阅读.NET 的垃圾收集应该为您清除很多东西。
在您的情况下,您不需要“销毁”所有子列表。事实上,您甚至无法以正常的良好实践 .NET 方式自行销毁或处置通用 List 对象。如果您不再希望使用它,那么只需删除对它的所有引用。对象的实际销毁将由垃圾收集器(又名 GC)在认为合适时完成。
GC 也非常聪明,它会检测循环引用和 a->b->c->d 对象树以及大多数你可以找到它并正确清理整个对象图的东西。因此,您无需创建递归清理例程。
但请注意,GC 的行为是不确定的,即您不知道实际的“清理”何时会发生,因此如果您的列表包含一些应该立即释放的重要资源,即文件句柄、数据库连接,那么您应该明确地“释放“正如@lassevk 推荐的那样。
您不需要清除子列表。
您唯一需要做的就是如果列表中的对象实现 IDisposable,那么您应该遍历对象并在清除列表之前调用 .Dispose() 方法。
您可以将列表对象设置为空!检查http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/31809230-83f6-4e86-9a33-ee7dc4ec2b10