Если класс реализует 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()
ничего не делает для улучшения переносимости.