Всякий раз, когда у вас есть ресурс, который нуждается в детерминированной очистке, то есть вы хотите, чтобы у вас была возможность «уничтожить», как только вы закончите с этим.
Более подробно интерфейс IDisposible в основном пытается решить проблему отсутствия ключевого слова `` delete '' в языках .net. Поскольку CLR - сбор мусора, вы никогда не знаете, когда будет запущен финализатор (деструктор) для объекта. GC имеет право ждать до тех пор, пока вам нравится, прежде чем обойтись, чтобы освободить управляемый ресурс.
Однако многие управляемые ресурсы обертывают основные конечные ресурсы - память - это не единственное, что необходимо выделить и освободить. Как уже упоминалось, дескрипторы файлов - один; база данных обрабатывает другую - существует множество примеров. Чтобы избежать непоследовательного беспорядка идиом очистки, шаблон IDisposible используется, чтобы сказать «Пожалуйста, отпустите свои конечные ресурсы, я покончил с ними». Поскольку он встроен в структуру, он получает специальную поддержку языка через «использование», чтобы гарантировать, что вы никогда не забудете вызвать методы Dispose и, следовательно, «утечку» неуправляемого ресурса.
Это не означает, что все IDisposible исполнители должны быть обернуты в использовании - если вы сохранить ссылку, и нужно их в будущем, вы должны, конечно, не обернуть их, как вы бы вызвать преждевременное высвобождение основной ресурс. Вызовите Dispose только, когда вы закончите с объектом и, таким образом, оберните «использование», только если вы знаете, что с ним закончили после окончания использования области.
Как и следовало ожидать, языки, которые имеют детерминированное разрушение, такие как C++/CLI, не нуждаются в «использовании». Объекты C++/CLI без кучи имеют метод Dispose, который вызывается автоматически, когда они выпадают из области видимости, имитируя поведение деструктора, которое пытается попытаться создать шаблон.
был бы указанным ниже, пожалуйста, оставьте комментарий. Спасибо –
2 downvotes и комментариев нет. что дает? –
Предполагая, что IDisposable является локальной переменной. Если это член класса, вы должны реализовать IDisposable для очистки этих объектов. –