Я хочу подчеркнуть мысль Брайана в его комментарии, потому что это важно.
Финализаторы не являются детерминированными деструкторами, как в C ++. Как указывали другие, нет гарантии того, когда он будет вызван, и, действительно, если у вас достаточно памяти, будет ли он вызываться когда-либо .
Но плохая вещь в финализаторах заключается в том, что, как сказал Брайан, он заставляет ваш объект пережить сборку мусора. Это может быть плохо. Почему?
Как вы можете знать, а можете и не знать, GC делится на поколения - Gen 0, 1 и 2 плюс куча больших объектов. Разделение - это бесполезный термин - вы получаете один блок памяти, но есть указатели того, где объекты Gen 0 начинаются и заканчиваются.
Мысленный процесс состоит в том, что вы, вероятно, будете использовать множество объектов, которые будут недолговечны. Так что GC должен легко и быстро добраться до объектов Gen 0. Поэтому, когда возникает нехватка памяти, первое, что он делает - это коллекция Gen 0.
Теперь, если это не устраняет достаточное давление, он возвращается и выполняет развертку 1-го поколения (переделывает Gen 0), а затем, если все еще недостаточно, он выполняет развертку 2-го поколения (повторяет Gen 1 и Gen 0). ). Таким образом, очистка долгоживущих объектов может занять некоторое время и быть довольно дорогой (поскольку ваши потоки могут быть приостановлены во время операции).
Это означает, что если вы делаете что-то вроде этого:
~MyClass() { }
Ваш объект, несмотря ни на что, доживет до Поколения 2. Это потому, что GC не может вызвать финализатор во время сборки мусора. Таким образом, объекты, которые должны быть завершены, перемещаются в специальную очередь, которая будет очищена другим потоком (потоком финализатора - который, если вы убьете, приведет ко всем видам плохих вещей). Это означает, что ваши объекты задерживаются дольше и потенциально вызывают больше сборок мусора.
Итак, все это просто для того, чтобы довести до ума то, что вы хотите использовать IDisposable для очистки ресурсов, когда это возможно, и серьезно попытаться найти способы обойти использование финализатора. Это в интересах вашего приложения.