Различия между деструктором, удалением и завершением метода - программирование
Подтвердить что ты не робот

Различия между деструктором, удалением и завершением метода

Я изучаю, как сборщик мусора работает в С#. Я запутался в использовании методов Destructor, Dispose и Finalize.

В соответствии с моими исследованиями и пониманиями, метод Destructor в моем классе скажет сборщику мусора выполнять сборку мусора способом, указанным в методе деструктора, который нельзя явно вызвать в экземплярах класса.

Метод Dispose предназначен для предоставления пользователю возможности управлять сборкой мусора. Метод Finalize освобождает ресурсы, используемые классом, но не сам объект.

Я не уверен, правильно ли я понимаю. Просьба уточнить сомнения. Любые дополнительные ссылки или руководства приветствуются.

4b9b3361

Ответ 1

Деструктор неявно вызывает метод Finalize, они технически одинаковы. Dispose доступен с тем объектом, который реализует интерфейс IDisposable.

Вы можете увидеть: Деструкторы С# - MSDN

Деструктор неявно вызывает Finalize в базовом классе объекта.

Пример из той же ссылки:

class Car
{
    ~Car()  // destructor
    {
        // cleanup statements...
    }
}

Код деструктора неявно переводится в следующий код:

protected override void Finalize()
{
    try
    {
        // Cleanup statements...
    }
    finally
    {
        base.Finalize();
    }
}

Ваше понимание деструктора верно:

Из MSDN

Программист не имеет контроля над вызовом деструктора, потому что это определяется сборщиком мусора. Сборщик мусора проверяет объекты, которые больше не используются приложением. Если он рассматривает объект, имеющий право на уничтожение, он вызывает деструктор (если он есть) и восстанавливает память, используемую для хранения объекта. Деструкторы также вызывается, когда программа выходит. Можно принудительно собрать сбор мусора, вызвав Collect, но большую часть времени этого следует избегать, так как это может вызвать проблемы с производительностью.

Ответ 2

В терминах С# деструктор и финализатор являются в основном взаимозаменяемыми концепциями и должны использоваться для выпуска неуправляемых ресурсов при сборе типа, например внешних ручек. Очень редко , что вам нужно написать финализатор.

Проблема заключается в том, что GC не является детерминированным, поэтому метод Dispose() (через IDisposable) позволяет поддерживать детерминированную очистку. Это не связано с сборкой мусора и позволяет вызывающему пользователю освободить любые ресурсы раньше. Он также подходит для использования с управляемыми ресурсами (в дополнение к неуправляемым), например, если у вас есть тип, который инкапсулирует (скажем) соединение с базой данных, вы можете захотеть избавиться от этого типа, чтобы освободить соединение.