Разница между деструктором, dispose и finalize метод


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

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

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

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

2 53

2 ответа:

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

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

деструктор неявным образом вызывает метод finalize для базового класса объект.

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

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

код деструктора неявно преобразуется в следующее код:

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

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

С MSDN

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

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

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