Является ли Finalize деструктором?
2 Answers
Деструктор - многозначное слово, в каждом языке он означает что-то свое.
С точки зрения спецификации языка C#, никакого метода Finalize нет. Есть только деструкторы, которые вызываются сборщиком мусора. Однако известные компиляторы преобразуют деструктор в метод Finalize, таким образом Finalize - это реализация языковой конструкции "деструктор".
С точки зрения языка С++, деструктор - это место где детерминированно освобождаются ресурсы. На роль такого деструктора больше подходит не Finalize, а метод Dispose. Это отражено в языке C++/CLI, где конструкция ~classname() преобразуется компилятором именно в Dispose, а для Finalize введена новая конструкция !classname()
С точки зрения языка Delphi в его неуправляемой версии, деструктор - это метод который освобождает память выделенную под объект. Такого деструктора в C# существовать не может.
- 58,537
-
Спасибо,а что такое Dispose,и как им пользоваться – Лаврик Кан Apr 10 '18 at 06:05
-
@ЛаврикКан https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/using-statement – Pavel Mayorov Apr 10 '18 at 06:06
-
3@ЛаврикКан https://ru.stackoverflow.com/q/486696/218063 – Андрей NOP Apr 10 '18 at 06:07
-
А что лучше использовать Finalize или IDisposable – Лаврик Кан Apr 10 '18 at 06:25
-
@ЛаврикКан от задачи зависит. Вы все-таки прочитайте ответ по ссылке, которую вам дал Андрей. – Pavel Mayorov Apr 10 '18 at 06:27
-
Извините я не дописал,для неуправляемых ресурсов что лучше использовать Finalize или IDisposable ? – Лаврик Кан Apr 10 '18 at 06:29
-
1@ЛаврикКан оба метода, а еще лучше - SafeHandle. Вы все-таки почитайте что написано по той ссылке. – Pavel Mayorov Apr 10 '18 at 06:31
У деструктора, строго говоря, определенная запись - это именно ~className() {}. А finalize - это часть внутренней инфраструктуры - и он неявно вызывается деструктором, причем когда и где выполнится finalize - не определено, т.е. решает рантайм и никак это нельзя контролировать. Для четкого контроля уничтожения ресурсов объекта следует реализовывать интерфейс IDisposable. И вообще все это не следует применять если у вас нет неуправляемых ресурсов - смысл теряется, а процессорное время тратится.
- 3,486
-
На самом деле компилятор превращает
~Classname() { ... }вprotected override void Finalize() { ...; base.Finalize(); }– Андрей NOP Apr 10 '18 at 05:37 -
Иными словами, на самом деле Finalize вызывает деструктор, а вовсе не наоборот. – Pavel Mayorov Apr 10 '18 at 05:45
-
Соглсаен с вашими поправками, но все же ответ от этого принципиально не меняется - деструктор и финалайз - не одно и тоже хоть и связаны. – srvr4vr Apr 10 '18 at 05:46
-
-
IDisposable- позволяет вам самим контролировать когда и где вызывать. Явное лучше неявного. На мой взгляд. – srvr4vr Apr 10 '18 at 06:27