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