Важное, но тонкое замечание, еще не упомянутое: редко рассматриваемая цель утилизации состоит в том, чтобы предотвратить преждевременную очистку объекта. Объекты с финализаторами должны быть написаны тщательно, чтобы финализатор не запустился раньше , чем ожидалось. Финализатор не может быть запущен до начала последнего вызова метода, который будет сделан для объекта (*), но иногда он может запускать во время последнего вызова метода, если объект будет отменен после того, как метод завершается. Код, который правильно удаляет объект, не может покинуть объект перед вызовом Dispose, поэтому нет опасности, что финализатор нанесет ущерб коду, который правильно использует Dispose. С другой стороны, если последний метод, использующий объект, использует сущности, которые будут очищены в финализаторе после последнего использования самой ссылки на объект, сборщик мусора может вызвать Finalize для объекта и очистить до объектов, которые все еще используются. Решение заключается в том, чтобы гарантировать, что любой метод вызова, использующий сущности, которые будут очищены финализатором, должен в какой-то момент сопровождаться вызовом метода, который использует «this». GC.KeepAlive (это) хороший метод для этого.
(*) Невиртуальные методы, которые расширены до встроенного кода, который ничего не делает с объектом, могут быть освобождены от этого правила, но Dispose обычно является или вызывает виртуальный метод.