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