2008-11-10 2 views
4

Если создать рекурсивный список списков:Метод List Clear() уничтожает детей [C# .NET]?

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

    //... 
} 

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

А потом называют tempList.Clear(), он будет уничтожать все childLists в памяти, или я должен создать рекурсивный метод, чтобы очистить все childLists первый?

ответ

9

Если нет другие ссылки существуют для детских списков, они будут собираться в мусор, как обычно. Трюк состоит в том, чтобы следить за любыми оборванными ссылками на дочерние элементы (привязка данных, как правило, остается незаметной после завершения).

1

Вам не нужно очищать суб-списки.

Единственное, что вам нужно сделать, это то, что объекты в вашем списке реализуют IDisposable, затем вы должны перебирать объекты и вызывать метод .Dispose() перед очисткой списка.

+0

делать это только в том случае, если вы уверены, что нет других ссылок на элементы в списке, в противном случае другой код может попытаться использовать объекты – 2008-11-10 18:23:33

4

Вы, кажется, пришли из фона C++.

A читать дальше .NET's Garbage Collection должно очистить многое для вас.

В вашем случае вам не нужно «уничтожать» все дочерние списки. Фактически, вы не можете даже уничтожить или уничтожить общий объект List самостоятельно в обычном способе .NET с хорошей практикой. Если вы больше не хотите его использовать, просто удалите все ссылки на него. И фактическое разрушение объекта будет выполняться сборщиком мусора (иначе GC), когда он сочтет это подходящим.

GC также очень умный, он будет обнаруживать круглые ссылки и a-> b-> c-> d деревья объектов, и большинство вещей, которые вы могли бы поднять, и правильно очистить весь объект. Поэтому вам не нужно создавать эту процедуру рекурсивной очистки.

Но обратите внимание, что поведение GC не определено, т. Е. Вы не будете знать, когда произойдет фактическая «очистка», поэтому, если ваш список содержит некоторые важные ресурсы, которые должны быть немедленно освобождены, т. Е. Дескрипторы файлов, подключения к базе данных, тогда вы должен явно «Dispose» из него, как рекомендовал @lassevk.

Смежные вопросы