Уничтожить и уничтожить в .Net - PullRequest
1 голос
/ 30 марта 2012

Может ли кто-нибудь объяснить различия между Dispose, Destructor и Finalize в .Net?
И когда их использовать?

1 Ответ

1 голос
/ 30 марта 2012

Если класс реализует IDisposable, то любой, вызывающий конструктор этого класса, должен убедиться, что метод IDisposable.Dispose() результирующего экземпляра будет вызван когда-то между последним использованием этого экземпляра и его отказом.Как правило, класс реализует IDisposable, если в какой-то момент своего существования экземпляр попросит какую-то другую сущность (которая может быть чем угодно, и даже не может быть на том же компьютере!), Чтобы начать делать что-то на своемимени, которое будет делать другая организация, пока не будет указано иное.IDisposable.Dispose() * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}}

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * T * * * * * * * * * * * * * * * * * * * * * * * * * * * * * T так при *IDisposable.Dispose() вызванный первым, .net и Java позволяют объектам запрашивать уведомление, если система обнаруживает, что они были оставлены.Такое уведомление принимает форму вызова метода с именем Finalize.Обратите внимание, что нет никакой гарантии относительно того, сколько времени проходит между оставлением объекта и вызовом Finalize().В некоторых случаях, если не соблюдать осторожность, система может вызвать Finalize для объекта, когда она занята, используя службы какого-либо другого объекта, который действует от его имени (что приводит к тому, что другой объект перестает предоставлять свои услуги, пока онивсе еще нужны).

Поскольку создателям стандарта C # не нравилась идея людей, пишущих код, который потребовал бы, чтобы инфраструктура включала переопределяемый метод Finalize в каждый объект, компиляторы C # этого не делают.разрешить коду переопределять финализировать.Вместо этого из очевидного ошибочного убеждения, что заброшенный объект может и должен быть переносимым, им требуется написать блок кода с использованием синтаксиса, похожего на деструктор C ++.Такой блок называется деструктором, хотя он ведет себя не так, как C ++.Вместо этого он генерирует переопределение для Finalize вместе с другим кодом.Обратите внимание, что любой код, который правильно использует деструктор в .net, должен использовать методы GC.SuppressFinalize() и GC.KeepAlive(), поэтому требование использования последовательности деструктора вместо переопределения Object.Finalize() ничего не делает для улучшения переносимости.

...