Уничтожает ли метод List Clear () дочерние элементы [C # .NET]? - PullRequest
4 голосов
/ 10 ноября 2008

Если я создаю рекурсивный список списков:

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

  //...
}

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

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

Ответы [ 4 ]

9 голосов
/ 10 ноября 2008

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

4 голосов
/ 10 ноября 2008

Похоже, вы пришли из C ++.

Чтение .NET сбора мусора должно многое прояснить для вас.

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

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

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

1 голос
/ 10 ноября 2008

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

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

0 голосов
/ 17 декабря 2010

Вы можете установить объект списка в null! Чек http://social.msdn.microsoft.com/Forums/en/csharpgeneral/thread/31809230-83f6-4e86-9a33-ee7dc4ec2b10

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...