Ответ 1
~ - деструктор
- Деструкторы вызываются автоматически и не могут быть явно вызваны.
- Деструкторы не могут быть перегружены. Таким образом, класс может иметь, самое большее, один деструктор.
- Деструкторы не наследуются. Таким образом, класс не имеет деструкторов, отличных от того, который может быть объявлен в нем.
- Деструкторы не могут использоваться с structs. Они используются только с классами. Экземпляр становится пригодным для уничтожения, когда уже невозможно использовать какой-либо код для использования экземпляра.
- Выполнение деструктора для экземпляра может произойти в любое время после того, как экземпляр получит право на уничтожение.
- Когда экземпляр разрушен, деструкторы в цепочке наследования вызываются, по порядку, от большинства полученных до наименее полученных.
Завершить
В С# метод Finalize выполняет операции, которые будет выполнять стандартный деструктор С++. В С# вы не называете его Finalize - вы используете синтаксис деструктора С++ размещения символа тильды (~) перед именем класса.
Dispose
Предпочтительнее удалять объекты в методе Close()
или Dispose()
, который может быть явно вызван пользователем класса. Finalize (деструктор) вызывается GC.
Интерфейс IDisposable сообщает миру, что ваш класс содержит ресурсы, которые необходимо удалить, и предоставляет пользователям способ их выпуска. Если вам необходимо реализовать финализатор в своем классе, метод Dispose должен использовать метод GC.SuppressFinalize()
, чтобы гарантировать, что финализация вашего экземпляра будет подавлена.
Что использовать?
Неправильно вызывать деструктор явно. Ваш деструктор будет вызываться сборщиком мусора. Если вы обрабатываете драгоценные неуправляемые ресурсы (например, дескрипторы файлов), которые вы хотите закрыть и утилизировать как можно быстрее, вы должны реализовать интерфейс IDisposable.