2

Является ли Finalize деструктором?

Pavel Mayorov
  • 58,537

2 Answers2

5

Деструктор - многозначное слово, в каждом языке он означает что-то свое.

С точки зрения спецификации языка C#, никакого метода Finalize нет. Есть только деструкторы, которые вызываются сборщиком мусора. Однако известные компиляторы преобразуют деструктор в метод Finalize, таким образом Finalize - это реализация языковой конструкции "деструктор".

С точки зрения языка С++, деструктор - это место где детерминированно освобождаются ресурсы. На роль такого деструктора больше подходит не Finalize, а метод Dispose. Это отражено в языке C++/CLI, где конструкция ~classname() преобразуется компилятором именно в Dispose, а для Finalize введена новая конструкция !classname()

С точки зрения языка Delphi в его неуправляемой версии, деструктор - это метод который освобождает память выделенную под объект. Такого деструктора в C# существовать не может.

Pavel Mayorov
  • 58,537
0

У деструктора, строго говоря, определенная запись - это именно ~className() {}. А finalize - это часть внутренней инфраструктуры - и он неявно вызывается деструктором, причем когда и где выполнится finalize - не определено, т.е. решает рантайм и никак это нельзя контролировать. Для четкого контроля уничтожения ресурсов объекта следует реализовывать интерфейс IDisposable. И вообще все это не следует применять если у вас нет неуправляемых ресурсов - смысл теряется, а процессорное время тратится.

srvr4vr
  • 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
  • А что лучше использовать Finalize или IDisposable – Лаврик Кан Apr 10 '18 at 06:22
  • IDisposable - позволяет вам самим контролировать когда и где вызывать. Явное лучше неявного. На мой взгляд. – srvr4vr Apr 10 '18 at 06:27