Основной ответ: это не проблема.
Я уже слышал подобные вопросы раньше, и они возникли из-за путаницы с подсчетом ссылок, где циклические ссылки создают проблему.
Сборщик .NET не считает ссылки, он просто сканирует и отмечает объекты, на которые ссылаются. Эти флаги также предотвращают его зацикливание. Это очень простой и практически надежный механизм. Системе не нужно подсчитывать или отслеживать входящие ссылки, поэтому для коротких ссылок нет накладных расходов. Но вы должны следить за тем, где существуют ссылки, общей проблемой являются объекты, которые подписываются на события. Событие сохраняет ссылку, поэтому необходимо отменить подписку, прежде чем подписавшийся объект можно будет восстановить. Другое преимущество GC заключается в том, что логика также работает в обратном порядке: всякий раз, когда ваш код имеет доступ к ссылке, эта ссылка гарантированно будет действительной, просто потому, что эта ссылка существует.
Подсчет ссылок требует, чтобы компилятор вводил код каждый раз, когда ссылка изменяется, копируется или выходит из области видимости, что приводит к постоянным издержкам. Когда количество падает до нуля, объект может быть немедленно уничтожен. Система нуждается в механизме (вручную) обработки циклов. Некоторые ужасные истории можно найти, выполнив поиск интерфейса COM IUnknown.