C # не волнует.Задачей CLR является выполнение GC.
GC запускается с известных корневых объектов (статических полей, локальных переменных, ...) и просматривает ссылки, пока не найдет все достижимые объекты.Все другие объекты могут быть собраны (за исключением некоторых вещей, связанных с финализатором).
Так что, если дочерние ссылки действительно были единственными ссылками на эти объекты, то будут собираться и внуки.Но если какой-либо живой внешний объект все еще имеет ссылку на один из ваших узлов, этот узел и все другие объекты, на которые он ссылается, будут поддерживаться.
Утечки управляемой памяти вызваны ссылками, которые поддерживают объекты живыми.
Например, при использовании базы данных в графическом интерфейсе есть ссылки на объекты, поддерживающие их работу.
Аналогичным образом, подписка на событие сохраняет объект, связанный с обработчиком событий, живым.Поэтому иногда события используют слабые ссылки, чтобы избежать этой проблемы.