【问题标题】:Does the List Clear() method destroy children [C#.NET]?List Clear() 方法是否会破坏子级 [C#.NET]?
【发布时间】:2010-09-21 16:15:12
【问题描述】:

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

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

  //...
}

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

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

【问题讨论】:

    标签: c# .net memory-management recursion


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您不需要清除子列表。

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

      【讨论】:

      • 只有在您确定没有其他对列表中项目的引用时才这样做,否则,其他代码可能会尝试使用 Disposed 对象
      【解决方案3】:

      您似乎来自 C++ 背景。

      阅读.NET's Garbage Collection 应该会为您解决很多问题。

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

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

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

      【讨论】:

        【解决方案4】:
        猜你喜欢
        • 2021-01-23
        • 1970-01-01
        • 2012-12-14
        • 2017-01-03
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多