Когда вызывается метод Finalize?

«Когда вызывается метод Finalize?» — вопрос из категории Управление памятью, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Метод Finalize (реализуемый через деструктор в C#) вызывается сборщиком мусора (Garbage Collector, GC) в неопределённый момент времени после того, как объект стал недостижимым, но перед тем, как его память будет окончательно освобождена.

Критически важные детали:

  • Время вызова не детерминировано. Нельзя полагаться на Finalize для своевременного освобождения критических ресурсов (например, файловых дескрипторов или сетевых соединений).
  • Порядок вызова не гарантирован. Объекты, ссылающиеся друг на друга, могут финализироваться в любом порядке.
  • Снижает производительность. Объекты с финализатором требуют дополнительной обработки GC и живут дольше.

Пример деструктора (финализатора):

public class ResourceHolder
{
    private IntPtr _unmanagedHandle; // Пример неуправляемого ресурса

    // Деструктор (синтаксический сахар для Finalize)
    ~ResourceHolder()
    {
        // Освобождение неуправляемых ресурсов
        if (_unmanagedHandle != IntPtr.Zero)
        {
            // Вызов нативной функции для освобождения, например:
            // CloseHandle(_unmanagedHandle);
        }
    }
}

Правильный паттерн: Для управления неуправляемыми ресурсами всегда реализуйте интерфейс IDisposable, который позволяет вызывать освобождение ресурсов явно и детерминировано, используя конструкцию using или вызов Dispose().