GC смотрит и видит, есть ли какие-либо ссылки на объект в настоящее время в приложении. Он достаточно умен, чтобы обрабатывать циклические ссылки, подобные приведенным выше.
Кроме того, он достаточно умен, чтобы справиться со случаем, когда у вас есть два объекта, A и B, и:
A.Event += B.Handler;
B.Event += A.Handler;
Если A и B оба выходят за рамки, GC достаточно умен, чтобы найти и очистить оба этих объекта, даже если они подписываются друг на друга. Однако, если отдельный объект (в использовании) ссылается на любой из них, это предотвратит сбор обоих.
Это одно из главных преимуществ настоящего решения ГХ по сравнению с решениями для подсчета ссылок. Подсчет ссылок не сможет собрать это, но .NET gc прекрасно с этим справится.