Сам сборщик мусора такой же. Однако существует разница в способах обработки финализаторов. В vb.net один переопределяет Object.Finalize()
, просто объявив Sub Overrides Finalize()
. Любой код в этой подпрограмме переопределит Object.Finalize
. В C # переопределение Object.Finalize()
запрещено. Вместо этого нужно использовать синтаксическую конструкцию, которая по иронии судьбы называется «деструктор» (хотя и предотвращает немедленное уничтожение объекта, когда это было бы иначе), которая переопределяет Finalize()
следующим:
override void Finalize(void)
{
try
{
.. supplied code here
}
finally
{
base.Finalize();
}
}
Предполагаемая цель языковой конструкции - сделать код финализации независимым от платформы. На практике это просто глупое неудобство, поскольку любой код, который использует финализаторы правильно , должен будет использовать методы, специфичные для платформы, такие как GC.KeepAlive()
и GC.SuppressFinalize()
.