Обратите внимание: этот вопрос касается разницы в терминологии между словами "деструктор" и "финализатор" и их правильного использования. Я просто привел примеры их использования в С# и С++/CLI, чтобы показать, почему я задаю вопрос. Я хорошо знаю, как это реализовано как в С#, так и в CLR, но я спрашиваю о правильном использовании терминологии.
В мире С# термины "деструктор" и "финализатор", по-видимому, используются в значительной степени взаимозаменяемо, что, как я подозреваю, связано с тем, что спецификация С# описывает недетерминированные функции очистки с использованием слова "деструктор", тогда как документация CLR всегда использует слово "финализатор", поэтому в пределах С# они означают одно и то же.
Однако в спецификации С++/CLI существует различие между ними. Он допускает как детерминированную, так и недетерминированную очистку и использует термин "деструктор" для детерминированной функциональности и "финализатор" для недетерминированной функциональности:
Финализатор обеспечивает недетерминированную очистку. Финализатор - это функция "последнего шанса", которая выполняется во время сбора мусора, обычно на объекте, деструктор которого не был выполнен.
Кроме того, описания Википедии destructor и finalizer указывают, что деструкторы и финализаторы являются отдельными понятиями и поддерживают использование С++/CLI терминов в отношении детерминизма:
В отличие от деструкторов, финализаторы не детерминированы. Деструктор запускается, когда программа явно освобождает объект. Финализатор, напротив, выполняется, когда внутренняя система сбора мусора освобождает объект.
Вопросы:
-
Существует ли с точки зрения компьютерной науки четко определенная разница между "деструктором" и "финализатором", или терминологией является то, что может быть определено только контекстно?
-
Если есть четко определенная разница, то почему С# spec использует "неправильную" терминологию?