Одной из основных проблем, которая может быть неприменима в вашем случае, но часто возникает, является то, что именно представляет собой «ресурс». С точки зрения объекта, неуправляемый ресурс - это то, что «делает» внешняя сущность () от его имени (*), что будет продолжать делать эта внешняя сущность - в ущерб другим правам - пока не сказал остановиться. Например, если объект открывает файл, компьютер, на котором размещен файл, может предоставить этому объекту эксклюзивный доступ, отказывая всем остальным в юниверсе в возможности использовать его, если только или до тех пор, пока не будет получено уведомление о том, что исключительный доступ больше не нужен.
(*), который может быть чем угодно, где угодно; возможно даже не на одном компьютере.
(**) или каким-либо образом, при котором поведение или состояние внешнего объекта изменяется
Если внешняя сущность делает что-то от имени объекта, который покинут и исчезает, не сообщив предварительно о том, что его услуги больше не требуются, внешняя сущность не сможет узнать, что она должна прекратить действовать от имени объект, который больше не существует. IDisposable предоставляет один из способов избежать этой проблемы, предоставляя стандартные средства уведомления объектов, когда их услуги не требуются. Объекту, услуги которого больше не требуются, обычно не требуется запрашивать какие-либо дополнительные услуги от каких-либо других субъектов, и поэтому он может запросить, чтобы любые субъекты, действовавшие от его имени, прекратили это делать.
Чтобы учесть случай, когда объект был оставлен без предварительного вызова IDisposable.Dispose()
, система позволяет объектам регистрировать "отказоустойчивый" метод очистки с именем Finalize()
. Поскольку по какой-либо причине создатели C # не любят термин Finalize()
, язык требует использования конструкции, называемой «деструктор», которая делает то же самое. Обратите внимание, что в общем случае Finalize()
будет маскировать, а не решать проблемы, и может создавать собственные проблемы, поэтому его следует использовать с особой осторожностью, если вообще.
«Управляемый ресурс» обычно представляет собой имя, данное объекту, который реализует IDisposable
и обычно, хотя и не всегда, реализует финализатор.