Я могу угадать ... и это действительно - это только предположение.Как говорит Эрик, не нарушайте правила, подобные этим :) Это предположение только ради пустых предположений и интереса.
Я подозреваю, что задействованы две структуры данных:
- Очередь финализации
- Заголовок объекта
Когда GC замечает, что объект подходит для сборки мусора, я подозреваю, что он проверяет заголовок объекта и добавляет ссылку на финализациюочередь.Ваши вызовы SuppressFinalization
предотвращают такое поведение.
Отдельно поток финализатора проходит через очередь финализации и вызывает финализатор для всего, что он находит.Ваши звонки на ReRegisterForFinalize
обходят нормальный способ, которым ссылка попадает в очередь, и добавляют ее напрямую.SuppressFinalization
не удаляет ссылку из очереди - она только останавливает добавление ссылки в очередь обычным способом *1021*.
Все это объясняет поведение, которое вы 'видишь (и который я воспроизвел).Это также объясняет, почему, когда я удаляю вызовы SuppressFinalization
, я в конечном итоге вижу финализатор, который вызывается три раза - потому что в этом случае "нормальный" путь добавляет ссылку на очередь финализации.