Различие между деструктором и финализатором?

Я всегда карта control + alt + f4 к документам. CloseAllWindows в опциях> среда> клавиатура.

несколько более интуитивно, чем использование мыши.

36
задан Greg Beech 9 December 2009 в 09:56
поделиться

4 ответа

1) Есть ли четко определенная разница между «деструктором» и «финализатором», используемыми в промышленности или в научных кругах?

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

2) В этом случае спецификация C # ошибается - финализаторы называются «деструкторами» в C #. Почему авторы спецификации C # ошиблись?

Я не знаю, но могу догадываться. На самом деле, у меня есть два предположения.

Предположение №1 состоит в том, что 12 мая 1999 года в википедии не было статьи, четко описывающей тонкую разницу между этими двумя концепциями. Это потому, что не было википедии. Помните, когда не было Википедии? Темные века, чувак. Ошибка могла быть просто честной ошибкой, полагая, что эти два термина идентичны.

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

Предположение №2 состоит в том, что 12 мая 1999 года комитет по разработке языков пожелал оставить открытой возможность того, что «деструктор» может быть реализован как нечто иное , чем финализатор. То есть «деструктор» был разработан как концепция языка C #, которая не обязательно соответствовала концепции «финализатора» .NET. При разработке языка одновременно с фреймворком, на котором он находится, "деструктор" для члена, который выполняет когда экземпляр возвращен. Классы могут иметь деструкторы; структуры не могут. В отличие от C ++, деструктор не может быть вызывается явно. Разрушение недетерминированный - вы не можете надежно знать, когда будет выполнен деструктор, за исключением того, что он выполняется в некоторых указать после всех ссылок на объект были освобождены. В деструкторы в цепочке наследования называются по порядку, из большинства от потомка к наименьшему потомку. Там нет необходимости (и нет) в производный класс для явного вызова базовый деструктор. Компилятор C # компилирует деструкторы в соответствующее представление CLR. За эта версия, которая, вероятно, означает финализатор экземпляра, который различаются в метаданных. CLR может предоставить статические финализаторы в будущее; мы не видим препятствий для C # с использованием статических финализаторов.

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

39
ответ дан 27 November 2019 в 06:03
поделиться

Строго говоря, в C # нет деструктора (я считаю, что спецификация C # в этом вопросе сбивает с толку). Финализатор C # выглядит как деструктор C ++, но, как вы говорите, не является детерминированным. В C # есть детерминированная очистка в виде IDisposable :: Dispose (но это все еще не называется деструктором).

В C ++ / CLI есть детерминированные деструкторы, которые выглядят как деструкторы C ++. На уровне CLI они отображаются на IDisposable :: Dispose () ( IDisposable реализован для вас). В C ++ / CLI есть недетерминированные финализаторы, которые выглядят как деструкторы, но используют! префикс вместо префикса ^.

Тот факт, что C ++ / CLI использует тот же синтаксис для деструкторов, который C # использует для финализаторов, может немного сбивать с толку, но он лучше подходит для C ++, который имеет сильную традицию детерминированного уничтожения.

К сожалению, отсутствие универсальных определений этих терминов означает, что вам всегда нужно разъяснять, о чем вы говорите. Лично я всегда использую слово финализатор , когда говорю о концепции C # и резервном деструкторе для контекстов, где это определенно подразумевает детерминированное разрушение.

[Обновить] После моего первоначального сообщения здесь Эрик Липперт опубликовал свой ответ (принятый ответ), а затем написал сообщение в блоге о том же. Рад видеть, что мы согласны: -)

6
ответ дан 27 November 2019 в 06:03
поделиться

Я считаю, что «деструктор» - это код C #, а «финализатор» - это скомпилированный метод CIL. Компилятор C # превращает деструктор в финализатор.

РЕДАКТИРОВАТЬ: Чтобы быть более подробным; Спецификация языка C # определяет «деструктор» как метод экземпляра C # для класса. «деструктор», таким образом, является частью грамматики C # - деструкторы - это лингвистические объекты, появляющиеся в исходном коде.

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

«Финализатор» - это термин, используемый в Common Language Runtime, например, при вызовах GC. WaitForPendingFinalizers () , и он относится к любому языку .net, а не только к C #. Любой ссылочный тип .net может иметь финализатор. Для класса C # (артефакт исходного кода) деструктор компилируется в метод CIL, который является финализатором типа CLR.

Или более кратко, деструктор должен быть финализатором как исходный код соответствует машинному коду ;)

4
ответ дан 27 November 2019 в 06:03
поделиться

Если мы будем придерживаться «детерминированного» определения деструкторов, то я бы сказал, что в объектах .NET нет деструкторов, если они явно не реализованы с помощью интерфейса IDisposable .

3
ответ дан 27 November 2019 в 06:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: