Dispose () вызывается в конце блока Using, чтобы вы могли рассчитывать на действия Dispose (например, закрытие соединения БД), которые будут выполняться, когда объект выходит из области видимости. Все просто.
Обновление: в вызове Dispose нет ничего специфического для неуправляемых ресурсов (хотя это обычное использование).
Обновление 2 : возникла небольшая дискуссия по теме, которую начал Рид Копси, которая полезна для понимания IDisposable. Я очень рекомендую эту статью для людей, желающих узнать больше.
В двух словах, класс IDisposable позволяет вам явно обрабатывать освобождение ресурсов (обычно неуправляемых ресурсов или подключений к базе данных) с помощью метода Dispose (). Экземпляры класса IDisposable должны создаваться в блоке «Using», чтобы обеспечить фактический вызов метода Dispose. Если вам не удастся сделать это (или вызвать его явно в блоке «finally» и т. Д.), Тогда ваш метод Dispose не будет вызываться, и вы потеряете объекты, которые хотите очистить. В всех случаях я помещаю одноразовые классы в блоки Using, и вы тоже должны.
В качестве альтернативы вы можете обрабатывать очистку ресурсов в Финализаторе (класс Destructor). Это будет вызвано автоматически, когда класс GC'd. Недостатки этого подхода состоят в том, что вы не будете явно контролировать , когда объекты очищены, и есть некоторые проблемы с многопоточностью, с которыми приходится сталкиваться. Так, например, проблемы в деструкторах очень трудно отлаживать из-за того, что они вызываются асинхронно и в другом потоке. Единственное преимущество заключается в том, что вам не нужно не забывать звонить своему деструктору, как вы это делаете. Конечно, если вы всегда используете «Использование блоков», это не проблема.
ПРИМЕЧАНИЕ. Я, ktrauberman, Reed и Pontus, сделал несколько хороших замечаний о том, как вы можете обойти те моменты, которые я делаю ниже. Это то, что я делаю, но я не могу утверждать, что это единственный способ сделать что-то. Действительно, Microsoft даже рекомендует в некоторых случаях вызывать Dispose () из финализатора. Тем не менее, я оставлю обсуждение здесь просто в качестве иллюстрации того, почему важно следовать совету Рида относительно осторожности при смешивании деструкторов и утилизации ().
Если я не согласен с ответом Рида, я утверждаю, что вы должны реализовать класс IDisposable, вызвав Dispose () в вашем Финализаторе. Это просто объединяет две разные конструкции и может привести к проблемам. Например, если вы создадите свой экземпляр класса IDisposable в блоке Using и и вызовете Dispose () в Destructor, он будет вызван дважды - с потенциально неприятными и трудными для отладки сбоями (опять же, вы не не контролирую сроки ГК). (Примечание: это действительно относится к деструкторам в целом - при определенных обстоятельствах их можно вызывать более одного раза!)