Список случаев, когда следует использовать оператор USING - PullRequest
0 голосов
/ 27 мая 2009

"Файл и шрифт - это примеры управляемых типов, которые обращаются к неуправляемым ресурсам (в данном случае к описателям файлов и контекстам устройств). Существует много других типов неуправляемых ресурсов и типов библиотек классов, которые их инкапсулируют. Все такие типы должны реализовывать IDisposable интерфейс. Как правило, когда вы используете объект IDisposable, вы должны объявить и создать его экземпляр в операторе using. " - MSDN

Есть ли список таких случаев (управляемые типы, которые обращаются к неуправляемым ресурсам, таким как FILE и FONT, ...), где должен использоваться оператор USING?

Ответы [ 5 ]

6 голосов
/ 27 мая 2009

Любой тип, который реализует IDisposable, должен использовать using.

Обновление (в ответ на комментарии): using должен окружать экземпляр типа IDisposable, предполагая, что он не требуется в большем объеме.

2 голосов
/ 27 мая 2009

Правильный подход: всегда использовать оператор using, когда тип реализует интерфейс IDisposable, но знают исключения из правила .

Известные исключения :

  • Основная форма (приложение Windows Forms, поскольку оно управляется классом Application)
  • SystemPens.*, SystemBrushes.* (эти статические экземпляры кэшируются внутри)
  • Icons.* (эти статические экземпляры кэшируются внутри)
  • Registry.* (эти статические экземпляры кэшируются внутри)
  • AutoResetEvent, ManualResetEvent (должен быть утилизирован, но если вы сделаете это, сделайте это очень осторожно, так как это может привести к гоночным условиям)

Список известных исключений определенно неполон.

2 голосов
/ 27 мая 2009

Нет. В статье MSDN только что говорилось, что вы должны рассмотреть возможность его использования при использовании объекта IDisposable. Есть много каркасных классов, реализующих IDisposable, и вы наверняка определите многие свои собственные.

2 голосов
/ 27 мая 2009

Всякий раз, когда у вас есть ресурс, который нуждается в детерминированной очистке, т. Е. Вы хотите, чтобы у него был шанс быть "уничтоженным", как только вы закончили с ним.

Более подробно, интерфейс IDisposible в основном пытается решить проблему отсутствия ключевого слова "delete" в языках .net. Поскольку CLR является сборщиком мусора, вы никогда не знаете, когда будет запущен финализатор (деструктор) для объекта. GC может подождать столько, сколько вам захочется, прежде чем приступить к освобождению управляемого ресурса.

Однако многие управляемые ресурсы обертывают базовые конечные ресурсы - память - не единственное, что должно быть выделено и освобождено. Как уже упоминалось, файловые дескрипторы являются одним; база данных обрабатывает другое - есть множество примеров. Чтобы избежать противоречивого беспорядка в идиомах очистки, шаблон IDisposible используется, чтобы сказать: «Пожалуйста, освободите ваши конечные ресурсы, я с ними покончил». Поскольку он встроен в платформу, он получает специальную языковую поддержку через «использование», чтобы гарантировать, что вы никогда не забудете вызвать методы Dispose, и, следовательно, «утечь» неуправляемый ресурс.

Это не означает, что все реализации IDisposible должны быть заключены в использование - если вы сохраняете ссылку и нуждаетесь в ней в будущем, вам, конечно, не следует ее переносить, так как это может привести к преждевременное освобождение основного ресурса. Вызывайте Dispose only , когда вы закончите работу с объектом, и, таким образом, включите «использование», только если вы знаете, что с ним покончено после того, как закончится использование области действия.

Так что, как и следовало ожидать, языки с детерминированным разрушением, такие как C ++ / CLI, не нуждаются в «использовании». Для объектов C ++ / CLI без кучи метод Dispose вызывается автоматически, когда они выпадают из области видимости, имитируя поведение деструктора, которое пытается захватить шаблон.

0 голосов
/ 27 мая 2009

Простое правило: «всякий раз, когда у вас есть ресурс, который должен быть освобожден сразу после использования, а не в какой-то неизвестный момент в будущем, когда сборщик мусора сможет его освободить».

Все ограниченные ресурсы, в основном, неуправляемые или управляемые. Файлы, сетевые сокеты, соединения с базой данных, дескрипторы реестра, все, что не должно оставаться неопределенным.

...