Вместо того, чтобы думать о ресурсах как о «вещах», которые нужно «высвобождать», лучше думать о приобретении объекта IDisposable
, который должен быть выполнен. Многие виды IDisposable
объектов просят внешние объекты действовать от их имени, пока они не уведомят эти объекты о том, что их услуги больше не нужны; тем самым они приобретают ответственность за то, чтобы эти внешние субъекты действительно получали такое уведомление. Когда Dispose
вызывается на IDisposable
, он может выполнить свою обязанность уведомить что-либо, чьи услуги он использовал, о том, что эти услуги больше не требуются.
Объекты могут запрашивать уведомление, если система замечает, что они были оставлены. Объекты, которые получают такое уведомление, могут, как правило, предполагать, что их услуги больше не нужны, и уведомлять любого, чьи услуги они использовали, об этом. Этот механизм в некоторых случаях работает нормально, но его не следует считать надежным, поскольку множество факторов могут помешать системе заметить, что объект был эффективно оставлен.
Что касается последствий отказа от вызова Dispose, то все очень просто: вещи, которые должны были произойти вследствие того, что сервисы объекта больше не требуются, не произойдут. Если объект должен был уведомлять другие объекты или объекты о том, что их услуги больше не требуются, и они в свою очередь должны были уведомлять другие объекты или объекты, ни одно из этих уведомлений не произойдет.
За исключением нескольких случаев, когда код будет использовать управляемый ресурс для жизни программы, и ОС может положиться на распознавание завершения программы как признака того, что программе больше не нужны ее службы, она будет как правило, проще вызывать Dispose
о вещах, которые больше не нужны, независимо от того, действительно ли они «заботятся» или нет, чем пытаться выявить случаи, когда серьезные проблемы могут быть вызваны неспособностью организаций уведомить все, что заботится о них. их услуги больше не нужны.