Строго говоря, любой объект, реализующий IDisposable
и область действия которого ограничена этой функцией, должен находиться внутри блока using
.Интерфейс IDisposable
существует для того, чтобы классы, которые имеют дело с неуправляемыми ресурсами (соединениями с базой данных, файловыми дескрипторами, оконными дескрипторами и т. Д.), Могли своевременно и детерминировать эти ресурсы.
В общем, естьтри способа использования объекта IDisposable
в классе:
- Объект создан и больше не нужен в рамках одного вызова метода.Это довольно распространенное явление, когда
using
можно (и нужно) использовать. - Объект создается классом (или передается классу), и его время жизни выходит за рамки области действия.одиночный вызов метода, но не за пределами жизни класса.Например, ваш класс создает
Stream
и должен использовать его в течение всего времени жизни объекта.В этом случае ваш класс должен реализовать сам IDisposable
и избавиться от объектов, которые вам принадлежат, когда вызывается ваш собственный метод Dispose
.Примером этого может быть что-то вроде System.IO.StreamWriter
- Объект передается классу, но класс не «владеет» им.Это означает, что полезное время жизни объекта
IDisposable
выходит за рамки одного вызова метода и может превышать время жизни вашего объекта.В этом случае кто-то другой должен нести ответственность за вызов Dispose
.
Первый случай является наиболее распространенным, с которым вы можете столкнуться, поэтому существует блок using
.Он обеспечивает удаление объекта, даже в случае исключения.
Некоторые примеры:
- Потоковые классы
- Соединения с базой данных /команды
- Элементы управления
Нет исчерпывающего списка классов, которые реализуют IDisposable
, так как этот список будет довольно большим и заполнен классами, которые вы, вероятно, никогда не встретите.Подумайте о том, что делает класс ;это открывает какое-то соединение или файл, который должен быть закрыт?В общем, получает ли он какой-то ресурс, который должен быть освобожден ?Если это так, он, вероятно, реализует это.На базовом уровне, если компилятор позволяет вам заключить его в using
, он реализует IDisposable
.
Что касается последствий , а не , вызывающих Dispose
, don 'не считаю это. Call Dispose .Правда, защитный стандарт состоит в том, что если ваш класс использует неуправляемые ресурсы напрямую , то вы должны определить финализатор, который будет вызывать dispose в случае, если ваш объект собран и кто-то не смог его вызвать, но это должноНе будь дизайнерским выбором.Насколько я знаю.