Целью IDisposable является предоставление стандартного средства уведомления объектов о том, что они больше не нужны. Некоторые объекты просят другие объекты (которые могут или не могут даже находиться на одном компьютере!) Делать что-либо от их имени до дальнейшего уведомления. Когда объекту говорят, что он больше не нужен, он может уведомить любые объекты, которые могут действовать от его имени, о том, что они больше не нуждаются в этом.
В качестве простого примера, создание файлового объекта может (косвенно) привести к отправке запроса на файловый сервер, чтобы открыть определенный файл для монопольного доступа. Пока файловый сервер не получит запрос на закрытие файла, он не позволит никому другому в известном юниверсе получить к нему доступ. Пока объект файла необходим, он будет поддерживать монопольный доступ к файлу. Если IDisposable.Dispose вызывается для файлового объекта, он (опять-таки, косвенно) заставляет отправлять «закрытый» запрос на файловый сервер, что позволяет другим программам и компьютерам получить доступ к файлу.
Обратите внимание, что если объект файла просто исчезнет, не уведомив никого о том, что ранее предоставленный исключительный доступ к файлу больше не требуется, сервер может никогда не позволить кому-либо еще использовать файл. Для защиты от проблем такого типа класс файлового объекта может определять обработчик Finalize (). Каждый раз, когда система создает объект класса, который переопределяет Object.Finalize()
, система добавляет его в специальный список объектов с «зарегистрированными» обработчиками Finalize. Если такой объект заброшен, сборщик мусора запустит свой метод Finalize, прежде чем он или любые объекты, на которые он имеет прямые или косвенные ссылки, будут фактически удалены из памяти.
Обратите внимание, что целью Dispose является не уничтожение самого файлового объекта, а предоставление ему возможности уведомить объект, предоставляющий монопольный доступ к файлу, о том, что такой доступ больше не нужен. Вызов Dispose для объекта, класс которого переопределяет Object.Finalize()
, уведомит сборщик мусора о том, что ему больше не нужно беспокоиться о вызове метода Finalize перед удалением объекта из памяти, но в противном случае он не уничтожит объект.